【问题标题】:How to group data by the values of a column? [R]如何按列的值对数据进行分组? [R]
【发布时间】:2015-08-04 16:31:40
【问题描述】:

我有一个这样的数据框:

ID RNA pathway
id1 rna1 pathway1
id1 rna5 pathway2
id2 rna2 pathway2
id2 rna2 pathway3
id3 rna3 pathway1
id3 rna3 pathway3
id4 rna17 pathway3

等等。我想做的是从第三(路径)列中获取值,并将每个唯一值放入新数据框中的新列中,然后用第一个数据框中的相应 ID 填充这些列。目标是从每个途径中选出一组,类似这样。

pathway1 pathway2 pathway3 ... pathwayN
id1      id1      id2          id3
id3      id7      id56         id8

我尝试使用 reshape2 包中的 dcast 解决问题 - 这样我就知道 ID 是否属于路径,但我无法将它们收集到单独的组中。

到目前为止的代码:

library("dplyr")
library("reshape2")
df<-read.table("~/data.csv", header=TRUE, sep=",")
df2<-dcast(df, pathway ~ id)
df2

【问题讨论】:

  • 能否请您也展示一下结果的外观?
  • 到目前为止,您可以发布您的代码吗?
  • 我刚刚更新了!一开始就应该这样做,谢谢提醒!
  • 您想要的输出不清楚。例如,为什么pathway1 会得到id3
  • 抱歉,我没有意识到所需的输出与原始数据框不匹配。我想说的是,任何数量的 ID 都可以(应该)与新数据框中的列匹配

标签: r


【解决方案1】:

试试

(res <- dcast(df, ID ~ pathway, fill=NA, value.var = "ID", id.var="pathway")[,-1])
#   pathway1 pathway2 pathway3
# 1      id1      id1     <NA>
# 2     <NA>      id2      id2
# 3      id3     <NA>      id3
# 4     <NA>     <NA>      id4

[,-1] 只是去掉最后的“ID”列。每行对应一个 ID。如果您想折叠结果以使所有 NA 都位于每列的末尾,并删除包含 NA 的行,您可以这样做

cleaned <- do.call(cbind, lapply(res, sort, na.last=T))
data.frame(cleaned[rowSums(!is.na(cleaned))>0, ])
#      pathway1 pathway2 pathway3
# [1,] "id1"    "id1"    "id2"   
# [2,] "id3"    "id2"    "id3"   
# [3,] NA       NA       "id4"   

【讨论】:

    【解决方案2】:

    这看起来很麻烦,所以希望有人能想出一个更简单的解决方案:

    > ListOfColumns = lapply(unique(data$pathway), function(x) {df = data.frame(unique(data[pathway == x, ]$ID)); names(df) = x; df})
    > ListOfColumns
    [[1]]
      pathway1
    1      id1
    
    [[2]]
      pathway2
    1      id2
    
    [[3]]
      pathway3
    1      id3
    2      id4
    

    现在确保所有列的长度相同,然后将它们全部合并:

    > Rows = do.call(max, lapply(ListOfColumns, nrow))
    > ListOfColumns = lapply(ListOfColumns, function(x) x[1:Rows, ,drop = F])
    > do.call(cbind, ListOfColumns)
       pathway1 pathway2 pathway3
    1       id1      id2      id3
    NA     <NA>     <NA>      id4
    

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 2015-05-15
      • 2017-01-23
      • 2012-09-24
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多