取以下数据框和向量,
df <- data.frame(x = 1:3, y = 4:6, z = 7:9)
v <- c(5, 10, 15)
假设我想将
df
逐列乘以 v
的元素,即 df[1] * v[1]
、 df[2] * v[2]
和 df[3] * v[3]
我可以用
Map
做到这一点> Map(`*`, df, v)
$x
[1] 5 10 15
$y
[1] 40 50 60
$z
[1] 105 120 135
现在,由于
Map
被定义为> Map
function (f, ...)
{
f <- match.fun(f)
mapply(FUN = f, ..., SIMPLIFY = FALSE)
}
<bytecode: 0x3950e00>
<environment: namespace:base>
我应该能够通过以下对
mapply
的调用完全重现上述内容似乎合乎逻辑,但事实并非如此。> mapply(`*`, df, v, simplify = FALSE)
# Error in .Primitive("*")(dots[[1L]][[1L]], dots[[2L]][[1L]],
# simplify = dots[[3L]][[1L]]) : operator needs one or two arguments
问题似乎在
"*"
的参数之内,而这些参数是> args("*")
function (e1, e2)
NULL
因此,再尝试两次会产生类似的错误。
> mapply(`*`, e1 = df, e2 = v, simplify = FALSE)
# Error in .Primitive("*")(e1 = dots[[1L]][[1L]], e2 = dots[[2L]][[1L]], :
# operator needs one or two arguments
> mapply(`*`, ..1 = df, ..2 = v, simplify = FALSE)
# Error in .Primitive("*")(..1 = dots[[1L]][[1L]], ..2 = dots[[2L]][[1L]], :
# operator needs one or two arguments
这里有什么问题?我怎样才能(准确地)复制结果
Map(`*`, df, v)
与
mapply
? 最佳答案
注意 Map
调用
mapply(FUN = f, ..., SIMPLIFY = FALSE)
不是
mapply(FUN = f, ..., simplify = FALSE)
当然 R 是区分大小写的。尝试
mapply(`*`, df, v, SIMPLIFY = FALSE)
# $x
# [1] 5 10 15
#
# $y
# [1] 40 50 60
#
# $z
# [1] 105 120 135
反而。使用
simplify = FALSE
,它试图调用`*`(df[[1]], v[1], simplify = FALSE)
这就是导致该错误的原因。
关于使用 mapply() 从 Map() 再现结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25320044/