2015-09-16 4 views
1

У меня есть dataframe (Annot_Subset), который выглядит следующим образом:Расщепление на основе разделителей и удаления дубликатов

IlmnID UCSC_RefGene_Group 
cg00050873   Body;TSS1500 
cg00212031    TSS200 
cg00213748      
cg00214611  1stExon;5'UTR 
cg00455876      
cg01707559 TSS200;TSS200;TSS200 
cg02004872  1stExon;5'UTR 

То, что я хотел бы сделать, это очистить последний столбец, выполнив следующие действия:

  1. Заменить с разными строками (напр тела;. TSS1500) со строкой "Multiple_locations"

  2. конденсироваться записи с одной строки неоднократного (например TSS200;. TSS200) Wi th, что строка появляется один раз

  3. Добавление строки «Intergenic» в записи, которые ничего не содержат.

Для примера:

IlmID UCSC_RefGene_Group 
cg00050873 Multiple_locations 
cg00212031    TSS200 
cg00213748   Intergenic 
cg00214611 Multiple_locations 
cg00455876   Intergenic 
cg01707559    TSS200 
cg02004872 Multiple_locations 

Я написал функцию, которая будет делать это; но было интересно, был ли более элегантный и эффективный способ приблизиться к проблеме. Тем более, что у моего блока данных 485 000 строк.

Это то, что я придумал:

Gene_Group_Split<-strsplit(Annot_Subset$UCSC_RefGene_Group,";") 
Clean.Gene.Group<-function(x) { 
    Gene_Group_Cleaned<-vector(mode="character",length=length(x)) 
    for (i in 1:length(x)) { 
    if (length(x[[i]])>=1) { 
     unique_set<-unique(x[[i]]) 
     if (length(unique_set)==1) { 
     Gene_Group_Cleaned[i]<-unique_set 
     } else { 
     Gene_Group_Cleaned[i]<-"Multiple_locations" 
     } 
    } else { 
     Gene_Group_Cleaned[i]<-"Intergenic" 
    } 
    } 
return(Gene_Group_Cleaned) 
} 

Gene_Group_2<-Clean.Gene.Group(Gene_Group_Split) 

ответ

2

Попробуйте этот пример:

df <- read.table(text=" 
IlmnID UCSC_RefGene_Group 
       cg00050873 Body;TSS1500 
       cg00212031 TSS200 
       cg00213748      
       cg00214611 1stExon;5'UTR 
       cg00455876      
       cg01707559 TSS200;TSS200;TSS200 
       cg02004872 1stExon;5'UTR", fill=TRUE, header=TRUE, stringsAsFactors=FALSE) 

df$Type <- 
    unlist(
    lapply(df$UCSC_RefGene_Group, function(i){ 
     x <- unique(unlist(strsplit(i,split = ";"))) 
     ifelse(length(x)>1,"Multiple_locations", 
      ifelse(length(x)==0,"Intergenic",x)) 
    }) 
) 

#result 
df 
#  IlmnID UCSC_RefGene_Group    Type 
# 1 cg00050873   Body;TSS1500 Multiple_locations 
# 2 cg00212031    TSS200    TSS200 
# 3 cg00213748        Intergenic 
# 4 cg00214611  1stExon;5'UTR Multiple_locations 
# 5 cg00455876        Intergenic 
# 6 cg01707559 TSS200;TSS200;TSS200    TSS200 
# 7 cg02004872  1stExon;5'UTR Multiple_locations 
0
library(dplyr) 
library(stringi) 
library(tidyr) 

df = read.table(text=" 
IlmnID UCSC_RefGene_Group 
       cg00050873 Body;TSS1500 
       cg00212031 TSS200 
       cg00213748      
       cg00214611 1stExon;5'UTR 
       cg00455876      
       cg01707559 TSS200;TSS200;TSS200 
       cg02004872 1stExon;5'UTR", fill=TRUE, header=TRUE, stringsAsFactors=FALSE) 

classify = function(string_vector) 
    if (length(string_vector) > 1) "Multiple_locations" else 
    if (string_vector == "") "Intergenic" else 
     string_vector 

df %>% 
    mutate(UCSC_RefGene_Group = 
      UCSC_RefGene_Group %>% 
      stri_split_fixed(";")) %>% 
    unnest(UCSC_RefGene_Group) %>% 
    distinct %>% 
    group_by(IlmnID) %>% 
    summarize(class = classify(UCSC_RefGene_Group)) 
Смежные вопросы