我正在尝试使用dplyr' mutate'命令在数组列表上执行匹配,但是收到错误"错误:递归索引在2级" 这是一个例子:
templist=list();templist[["A"]]=c(6,9,8,1);templist[["B"]]=c(1,9,6,8);templist[["C"]]=c(8,1,9,6)
tempdat=data.frame(SYSTEM=c("A","A","A","B","B","B","C","C","C"),nums=c(1,8,9,1,8,9,1,8,9))
提供
templist
$A
[1] 6 9 8 1
$B
[1] 1 9 6 8
$C
[1] 8 1 9 6
和
tempdat
SYSTEM idnum
1 A 1
2 A 8
3 A 9
4 B 1
5 B 8
6 B 9
7 C 1
8 C 8
9 C 9
然后,我想找到匹配数字的位置,列出与相应系统相对应的列表。 E.g。
tempdat %>% mutate(numids=match(nums,templist[[SYSTEM]]))
应该产生
tempdat
SYSTEM nums numids
1 A 1 1
2 A 8 3
3 A 9 2
4 B 1 1
5 B 8 4
6 B 9 2
7 C 1 2
8 C 8 1
9 C 9 3
但是我得到了上面提到的错误
(错误:递归索引在级别2失败)
任何人都能解释为什么会失败吗?或者更好的是,找到一种方法来正确完成这项工作? 我有一种预感,可以使用for循环为每个列表创建单独的数据帧,然后使用left_join将每个系统帧的匹配索引添加到原始帧,但这看起来可能效率非常低,不雅,笨重...
答案 0 :(得分:2)
失败的原因是列表的[[
不接受向量索引,而传递给mutate
函数的变量本质上是一个向量。快速解决方法是按SYSTEM
对数据框进行分组,并将unique
变量传递给它,因此对于每个组,SYSTEM
将是单个值而不是向量:
tempdat %>% group_by(SYSTEM) %>% mutate(numids=match(nums,templist[[unique(SYSTEM)]]))
# Source: local data frame [9 x 3]
# Groups: SYSTEM [3]
#
# SYSTEM nums numids
# (fctr) (dbl) (int)
# 1 A 1 4
# 2 A 8 3
# 3 A 9 2
# 4 B 1 1
# 5 B 8 4
# 6 B 9 2
# 7 C 1 2
# 8 C 8 1
# 9 C 9 3
如果您检查templist[[c("A", "B", "A")]]
,您会发现它会抛出与您所看到的完全相同的错误:
临时列表中的错误[[c(" A"," B"," A")]]:递归索引失败 在第2级