[英]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.