【问题标题】:R: choose elements from list based on values in vector with same namesR:根据具有相同名称的向量中的值从列表中选择元素
【发布时间】:2021-09-15 01:58:24
【问题描述】:

[可能这个问题在这里已经有了答案,但我没有找到答案,也是因为我在简明扼要的表述上有些困难。感谢您提出重新制定问题标题的建议。]

我有

  • 具有不同行数的矩阵列表,
  • 与列表同名的整数值向量,
  • 出现在上述列表和向量中的名称列表,
  • 一个整数变量,告诉从这些矩阵中选择哪一列。

让我们构建一个工作示例:

mynames <- c('a', 'c')

mylist <- list(a=matrix(1:4,2,2), b=matrix(1:6,3,2), c=matrix(1:8,4,2))

myvec <- 2:4
names(myvec) <- names(mylist)

chooseCol <- 2

我想构造一个向量,其中包含来自myvec 的行和列chooseCol 的元素,用于出现在mynames 中的名称。我的尝试是

sapply(mynames, function(elem){mylist[[elem]][myvec[elem], chooseCol]})

正确产生

a c 
4 8 

但我想知道是否有更快的base(非tidyverse)方法来执行此操作。

同样重要或相关:mylistmyvec 中的名称顺序可能不同,因此我不能依赖位置索引。

【问题讨论】:

    标签: r list vector


    【解决方案1】:

    我会使用mapply -

    mapply(function(x, y) x[y, chooseCol], mylist[mynames], myvec[mynames])
    
    #a c 
    #4 8 
    

    【讨论】:

    • 不错的@Ronak,点赞。这是否意味着 mapply 在某种程度上像 purrr::map2_df 一样工作?
    • 谢谢,这样更优雅。看起来有点,只是比sapply慢一点。
    • @AnilGoyal 这取决于我们在这种情况下从函数返回的内容,我会说它类似于map2_dbl,即purrr::map2_dbl(mylist[mynames], myvec[mynames], ~.x[.y, chooseCol])
    • @pglpm 你在更大的样本上测试了吗?您的数据有多大?
    • @RonakShah 现在我只是在system.time 下重复调用1e6 次。但差异只有十分之几秒。我会把它应用到真实案例中,并及时通知你。
    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2021-08-09
    • 2021-01-14
    • 2023-02-23
    相关资源
    最近更新 更多