基于匹配的元素名称合并列表中的向量

时间:2016-10-07 15:44:41

标签: r list merge

我有一个我要合并的列表:

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-cb-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相同)。即使它们有不同的名称,我如何删除重复项呢?

1 个答案:

答案 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]