如何按列的值对数据进行分组? [R]

时间:2015-08-04 16:31:40

标签: 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

2 个答案:

答案 0 :(得分:3)

尝试

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

答案 1 :(得分:0)

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

> 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