【问题标题】:Lookup Values in Named List to Replace in another Named List in R在命名列表中查找值以替换 R 中的另一个命名列表
【发布时间】:2019-07-13 09:28:09
【问题描述】:

我有一份调查的编码答案列表,以及一份法典,其中包含对所述调查中特定问题的每个可能的编码答案,并存储了实际答案。数据被设置为一个列表,它是为上下文构建的:

mylist=list(a=list(AA="Yes",AB="No",AC="Maybe"),b=list(BA="Yes",BB="No",BC="Maybe"))
myanswers<-list(a="AA",b="BC")

所以目前数据如下:

myanswers
$a
[1] "AA"

$b
[1] "BC"

但我想要

myanswers
$a
[1] "Yes"

$b
[1] "Maybe"

我尝试过使用不同的 lapply 方法,但无法让它们发挥作用。此外,索引并不总是对齐,因此尝试 for 循环也没有获得最佳结果。

【问题讨论】:

    标签: r list functional-programming dplyr named


    【解决方案1】:

    假设列表顺序相同,您可以使用基本 R 和 mapply 函数来完成此操作

    mapply(function(a,b) a[b], mylist, myanswers)
    

    如果不是这样,您可以Map 覆盖名称

    Map(function(x) {
        mylist[[x]][[myanswers[[x]]]]
    }, names(myanswers))
    

    【讨论】:

    • 这可行,但 "myanswers" 中的某些元素不在 "mylist" 中,因此程序中断并说下标超出范围
    • 在这种情况下你想要什么行为?当可重现的示例捕获您希望处理的不同案例时,会更容易提供帮助。
    【解决方案2】:

    您首先创建查找表的另一个选项

    (lookup <- do.call(rbind, lapply(mylist, stack)))
    #    values ind
    #a.1    Yes  AA
    #a.2     No  AB
    #a.3  Maybe  AC
    #b.1    Yes  BA
    #b.2     No  BB
    #b.3  Maybe  BC
    

    然后使用lapplymatch进行替换

    lapply(myanswers, function(x) lookup$values[match(x, lookup$ind)])
    #$a
    #[1] "Yes"
    #
    #$b
    #[1] "Maybe"
    

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 2011-10-02
      • 1970-01-01
      相关资源
      最近更新 更多