我有一个我要合并的列表:
path_list <- list(a = c("path1","path2","path3"), b= c("path4","path5"), c= c("path6","path7"), d = c("path8","path9","path10"))
path_list
$a
[1] "path1" "path2" "path3"
$b
[1] "path4" "path5"
$c
[1] "path6" "path7"
$d
[1] "path8" "path9" "path10"
我想根据下面的data.frame
合并其中的元素:
ID.list <- data.frame(Id1 = c("a","b", "c","d"), Id2 = c("c","d","a","b"))
Id1 Id2
a c
b d
这样a-c
和b-d
一样合并在一起,名称为ID.list$ID2
。
result
$c
[1] "path1" "path2" "path3" "path6" "path7"
$d
[1] "path4" "path5" "path8" "path9" "path10"
这可能吗?我查看了this,但我的真实数据有40 Ids
,因此无法弄清楚如何操作。
编辑:
请注意,a-c
之间的合并与c-a
相同(b-d
相同)。即使它们有不同的名称,我如何删除重复项呢?
答案 0 :(得分:4)
我们可以遍历&#39; ID.list&#39;的行序列,将&#39; ID.list&#39;的元素子集化,将其用作索引以获取&#39; path_list& #39;元素和unlist
它。
lapply(seq_len(nrow(ID.list)), function(i)
unlist(path_list[as.character(unlist(ID.list[i,]))], use.names=FALSE))
或者另一个选项是行split
,然后将其子集
lapply(split(as.matrix(ID.list), row(ID.list)), function(x)
unlist(path_list[x], use.names = FALSE))
如果&ID; ID.list&#39;中有元素。相反,也许这应该有用
ID.list2 <- as.data.frame(unique(t(apply(ID.list, 1, sort))),
stringsAsFactors=FALSE)
lst <- lapply(seq_len(nrow(ID.list2)), function(i)
unlist(path_list[as.character(unlist(ID.list2[i,]))], use.names=FALSE))
names(lst) <- ID.list2[,2]