【问题标题】:Merge vectors in list based on matching names of elements根据匹配的元素名称合并列表中的向量
【发布时间】:2017-02-16 16:25:34
【问题描述】:

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

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 也是如此)。即使名称不同,我该如何删除重复项?

【问题讨论】:

    标签: r list merge


    【解决方案1】:

    我们可以遍历“ID.list”的行序列,对“ID.list”的元素进行子集化,将其用作获取“path_list”元素和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.list' 中有反向的元素,也许这应该有效

    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]
    

    【讨论】:

    • 对不起,我好像弄错了OP的目标
    • @bouncyball 没关系,我也被帖子误导了
    • 这在一定程度上有效。他们创建的列表没有ID.list$Id2 列中的名称。这可能吗?
    • @Bonono 可以设置名称为setNames(lapply(....,), as.character(ID.list[[2]]))
    • 请看我的编辑 - 我意识到ID.list 的真实数据略有不同。
    猜你喜欢
    • 2018-02-03
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2014-03-15
    • 1970-01-01
    • 2014-12-19
    • 2023-01-28
    相关资源
    最近更新 更多