查找命名列表中的值以替换R中另一个命名列表中的值
我有一份调查的编码答案列表,以及一份抄本,该抄本包含了对所述调查中某个特定问题的每个可能的编码答案,并存储了实际答案。数据被设置为一个列表,该列表是为上下文构建的:查找命名列表中的值以替换R中另一个命名列表中的值,r,list,functional-programming,dplyr,named,R,List,Functional Programming,Dplyr,Named,我有一份调查的编码答案列表,以及一份抄本,该抄本包含了对所述调查中某个特定问题的每个可能的编码答案,并存储了实际答案。数据被设置为一个列表,该列表是为上下文构建的: 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] "Yes" $b [1] "Maybe" 我尝
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] "Yes"
$b
[1] "Maybe"
我尝试过使用不同的lappy方法,但都没能让它们发挥作用。此外,索引并不总是对齐的,因此尝试for循环也没有获得最佳结果。如果列表的顺序相同,可以使用base R和
mapply
函数来实现这一点
mapply(function(a,b) a[b], mylist, myanswers)
当然,如果不是这样的话,您可以映射这些名称
Map(function(x) {
mylist[[x]][[myanswers[[x]]]]
}, names(myanswers))
第一次创建查找表的另一个选项
(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
这是可行的,但“myanswers”中的某些元素不在“mylist”中,因此程序会中断并说下标超出范围。在这种情况下,您希望有什么行为?当可再现的示例捕获了您希望处理的不同案例时,更容易提供帮助。
(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
lapply(myanswers, function(x) lookup$values[match(x, lookup$ind)])
#$a
#[1] "Yes"
#
#$b
#[1] "Maybe"