dplyr mutate中的递归错误

时间:2015-05-21 12:43:15

标签: r dplyr

刚刚学习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)])

它再次被选中&#34;未定义的列&#34;

2 个答案:

答案 0 :(得分:3)

'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

我们在matchnames(m)

之间使用levels(s$mult)获得相同的输出顺序
  m[match(names(m), levels(s$mult))]
  #    M     G    K
  #1 1e+06 1e+09 1000

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

答案 1 :(得分:0)

如果您不介意更改join的数据结构,可以使用

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) 为基础。

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