dplyr mutate 中的递归错误

recursive error in dplyr mutate

刚刚学习 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 更新为

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

它再次崩溃 "undefined columns selected"

'mult' 列是 'factor' class。将其转换为 '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

如果我们查看 'factor' 列如何基于 'levels'

 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

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

如果您不介意更改 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 为基础。

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