2016-06-11 18 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

base Rオプションです別のオプション: 'df%>%separate_rows(gene.names、sep ="; ")' – jalapic

3

がありtidyr` v5.0では `で、今日のように、ただ、完全性について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> 
関連する問題