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
为基础。
编辑:虽然它有效,但您可能需要稍微注意列中的数据类型
刚刚学习 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
为基础。
编辑:虽然它有效,但您可能需要稍微注意列中的数据类型