繁体   English   中英

如何按列值分组数据? [R]

[英]How to group data by the values of a column? [R]

我有一个这样的数据框:

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

尝试

(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"   

这似乎很麻烦,所以希望有人可以找出一个更简单的解决方案:

> 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM