【问题标题】:Accessing list elements within mutate访问 mutate 中的列表元素
【发布时间】:2016-07-14 23:02:09
【问题描述】:

我正在尝试使用 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

然后我想找到与相应系统对应的列表匹配数字的位置。例如

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 将每个系统帧的匹配索引添加到原始帧上,但这似乎效率很低,不优雅,笨重...

【问题讨论】:

    标签: r list dplyr


    【解决方案1】:

    失败的原因是[[ for list 不接受向量索引,而传递给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")]],你会发现它抛出的错误和你看到的完全一样:

    templist[[c("A", "B", "A")]] 中的错误:递归索引失败 2级

    【讨论】:

    • 完美!像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多