2016-06-11 38 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> 
相關問題