【问题标题】:Split strings in column dataframe in R and create additional columns for the substrings在 R 中的列数据框中拆分字符串并为子字符串创建附加列
【发布时间】:2016-06-11 22:50:45
【问题描述】:

在处理基因组阵列数据时,“探针”通常分配给不同的基因(不同的转录本)。对象df 显示了一个例子。

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>

【问题讨论】:

    标签: r dataframe split


    【解决方案1】:

    我建议为此使用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
    

    【讨论】:

    • 为了完整起见,截至今天在tidyr v5.0 中还有另一个选项:df %&gt;% separate_rows(gene.names, sep=";")
    【解决方案2】:

    这是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>
    

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 2018-10-29
      • 2020-08-07
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多