【问题标题】:recursive error in dplyr mutatedplyr mutate 中的递归错误
【发布时间】:2015-08-03 03:28:57
【问题描述】:

刚刚学习 dplyr(和 R),我不明白为什么会失败或正确的方法是什么。我正在寻找一般解释,而不是针对这个人为数据集的特定解释。

假设我有 3 个带有乘数的文件大小,我想将它们组合成一个数字列。

require(dplyr)

m <- data.frame(
    K = 1E3, 
    M = 1E6, 
    G = 1E9
)

s <- data.frame(
    size = 1:3,
    mult = c('K', 'M', 'G')
)

现在我想将大小乘以它的乘数,所以我尝试了:

mutate(s, total = size * m[[mult]])

#Error in .subset2(x, i, exact = exact) : 
#    recursive indexing failed at level 2 

这会引发错误。我也试过了:

mutate(s, total = size * as.numeric(m[mult]))

#1    1    K 1e+06
#2    2    M 2e+09
#3    3    G 3e+03

这比错误更糟糕(错误答案)!

我尝试了很多其他排列,但找不到答案。

提前致谢!


编辑:
或者这应该是另一个问题
akrun 的回答效果很好,我以为我理解了,但是如果我

rbind(s, c(4, NA))

然后将变异更新为

mutate(s, total = size * 
    ifelse(is.na(mult), 1,
        unlist(m[as.character(mult)])

它再次崩溃,“选择了未定义的列”

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    “mult”列是“factor”类。将其转换为 'character' 以对 'm'、'unlist' 进行子集化,然后与 'size' 相乘

     mutate(s, new= size*unlist(m[as.character(mult)]))
     #  size mult   new
     #1    1    K 1e+03
     #2    2    M 2e+06
     #3    3    G 3e+09
    

    如果我们查看“因素”列如何根据“级别”起作用

     m[s$mult]
     #    M     G    K
     #1 1e+06 1e+09 1000
    

    我们通过在names(m)levels(s$mult) 之间使用match 得到相同的输出顺序

      m[match(names(m), levels(s$mult))]
      #    M     G    K
      #1 1e+06 1e+09 1000
    

    所以,这可能是您得到不同结果的原因

    【讨论】:

    • 所以,如果我理解正确,在我的第二个示例中,'K' 被强制转换为数字 2(因为它的因子级别),然后检索 m[2] 而不是 m[['K' ]]。这就说得通了。谢谢你。 (R 不是一门容易上手的语言。)
    • @bob 我猜这里可能就是这种情况。
    【解决方案2】:

    如果你不介意改变m的数据结构,你可以使用

    # change m to a table
    m = as.data.frame(t(m))
    m$mult = rownames(m)
    colnames(m)[which(colnames(m) == "V1")] = "value"
    
    # to avoid indexing
    s %>% 
      inner_join(m) %>% 
      mutate(total = size*value) %>% 
      select(size, mult, total)
    

    以保持更多 dplyr 为基础。

    编辑:虽然它有效,但您可能需要注意列中的数据类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多