我有一个这样的数据框:
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
答案 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