【问题标题】:how to split each columns in a row to separate column in R [duplicate]如何拆分一行中的每一列以分隔R中的列[重复]
【发布时间】:2017-05-03 20:27:35
【问题描述】:

我想从输入数据中拆分 4 行中的每一列,以将第一列分隔到另一列下方,如专家输出所示

输入

 cytoband   11qE2         1qC1.1      13qD2.1
    q value     1.16          1.53        1.13
    wide      11:119210       1:50490     13:107190
    genes    Aatk,Actg1,Alyref Tin,Ern    Alk,Nf12

预期输出

cytoband    11qE2         1qC1.1      13qD2.1
q value     1.16          1.53        1.13
wide      11:119210       1:50490     13:107190
genes    Aatk             Tin         Alk
         Actg1            Ern         Nf12
         Alyref           

【问题讨论】:

  • 你应该转置你的数据;您的变量是水平的而不是垂直的,这在 data.frame 中效果不佳。完成此操作后,您需要决定如何安排数据。您可以重复其他数据,在边缘列中插入NAs(不推荐,除非基因的顺序有意义),或使用列表列(最有效的选择,但需要一点技巧才能有效地操作)。

标签: r dplyr tidyr splitstackshape


【解决方案1】:

我认为你想要的是 tidyr 包中的 separate_rows。

文档中有一个示例:

 df <- data.frame(
   x = 1:3,
   y = c("a", "d,e,f", "g,h"),
   z = c("1", "2,3,4", "5,6"),
   stringsAsFactors = FALSE
 )
separate_rows(df, y, z, convert = TRUE)

如果您使用标准 eval 版本的separate_rows_,您可以使用列名,这样可以得到如下信息:

names <- colnames(df)
for(col in names) {
 df <- separate_rows_(df, col, sep = ",", convert = FALSE)
}

不完美,因为它会导致值重复,但也许可以开始?

【讨论】:

  • @Knachman.. 很高兴了解 separate_rows() 函数。就我而言,我有 139 列。所以我想做;单独的行(dm1,V1:V139,转换=真);但出现错误错误:所有嵌套列必须具有相同数量的元素。
  • 你说得对,这是一个烦人的问题!我的第一个想法是尝试把它放在一个循环中,我在上面编辑了一些可以帮助你开始的东西。
  • 使用for 循环基本上会创建拆分变量的笛卡尔积,这可能是不希望的。例如,df &lt;- data.frame(x = 1:3, y = c("a", "d,e", "g,h"), z = c("1", "2,3,4", "6")) 应该产生 6 行,因为每行中的并行最大项目数是 1、3 和 2。但是,for 循环将产生 1 + 2x3 + 2 = 9 行。 @beginner,the development version of "splitstackshape" 应该能够使用 cSplit(df, 2:3, ",", "long")(或 cSplit(dm1, paste0("V", 1:139), ",", "long"))来处理这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 2018-02-05
  • 2018-09-24
相关资源
最近更新 更多