2016-06-11 39 views
4

使用基因组数组数据时,通常会将“探针”分配给不同的基因(不同的转录本)。对象df显示了一个这样的例子。在R中的列数据框中拆分字符串并为子字符串创建其他列

df <- data.frame(c("geneA;geneB;geneB", "geneG", "geneC;geneD")) 
colnames(df) <- "gene.names" 
df#looks like this: 

     gene.names 
1 geneA;geneB;geneB 
2    geneG 
3  geneC;geneD 

我想在;df$gene.names所有元件分开,并把每串在新列。如果连续不再有基因,可以使用NA

这个脚本的作品,但我认为大多数人会同意这是一个贪婪的代码,而不是太高效。有人可以提出更好的选择吗?

library(plyr)#load this library first 

out <- NULL 
for (i in 1:NROW(df)){ 
    one <- as.data.frame(t(as.data.frame(strsplit(as.character(df[i,1]), ";")))) 
    out <- rbind.fill(out, one) 
} 
out#looks like this: 

    V1 V2 V3 
1 geneA geneB geneB 
2 geneG <NA> <NA> 
3 geneC geneD <NA> 

回答

6

我建议使用splitstackshape此:

splitstackshape::cSplit(df, splitCols="gene.names", sep=";") 

    gene.names_1 gene.names_2 gene.names_3 
1:  geneA  geneB  geneB 
2:  geneG   NA   NA 
3:  geneC  geneD   NA 
+1

只是为了保持完整性,今天的'tidyr' V5.0有另一个选项:'df%>%separate_rows(gene.names,sep =“;”)' – jalapic

3

这里是一个base R选项与read.table

read.table(text= as.character(df$gene.names), sep=";", 
     header=FALSE, stringsAsFactors=FALSE, fill=TRUE,na.strings="") 
#  V1 V2 V3 
#1 geneA geneB geneB 
#2 geneG <NA> <NA> 
#3 geneC geneD <NA> 
相关问题