访问mutate中的列表元素

时间:2016-07-14 23:02:10

标签: r list dplyr

我正在尝试使用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将每个系统帧的匹配索引添加到原始帧,但这看起来可能效率非常低,不雅,笨重...

1 个答案:

答案 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级