理解 do.call() 对数据框行 'paste' 与 'function(x) paste(x)' 的处理
Understanding do.call() treatment of 'paste' versus 'function(x) paste(x)' on data frame rows
我对 do.call 的工作原理感到困惑。
dat <- data.frame(v1 = c("a", "a", "b", "b"),
v2 = c("a", "b", "a", "b"),
stringsAsFactors = FALSE)
为什么这似乎一次通过一行
do.call(paste, dat)
[1] "a a" "a b" "b a" "b b"
但这不是
do.call(function(x) paste(x), dat)
Error in (function (x) :
unused arguments (v1 = c("a", "a", "b", "b"), v2 = c("a", "b", "a", "b"))
我要使用的函数是
paste_ <- function(x) paste(unique(sort(x)), collapse = "_")
我确实意识到我可以只使用 apply
来获得我想要的东西,但我试图了解 do.call
在做什么。
apply(vars_comb, 1, paste_)
do.call的输入是一个列表,数据帧是列表。所以 do.call(paste, dat)
等同于:
paste(v1=dat$v1, v2=dat$v2)
而您定义的函数只接受一个 "x" 参数。所以第二部分相当于:
my_paste <- function(x) paste(x)
my_paste(v2=dat$v1, v1=dat$v2)
这会给您同样的错误,因为 v1 和 v2 未定义。
但是,您可以看到以下内容确实有效:
do.call(function(...) paste(...), dat)
我对 do.call 的工作原理感到困惑。
dat <- data.frame(v1 = c("a", "a", "b", "b"),
v2 = c("a", "b", "a", "b"),
stringsAsFactors = FALSE)
为什么这似乎一次通过一行
do.call(paste, dat)
[1] "a a" "a b" "b a" "b b"
但这不是
do.call(function(x) paste(x), dat)
Error in (function (x) :
unused arguments (v1 = c("a", "a", "b", "b"), v2 = c("a", "b", "a", "b"))
我要使用的函数是
paste_ <- function(x) paste(unique(sort(x)), collapse = "_")
我确实意识到我可以只使用 apply
来获得我想要的东西,但我试图了解 do.call
在做什么。
apply(vars_comb, 1, paste_)
do.call的输入是一个列表,数据帧是列表。所以 do.call(paste, dat)
等同于:
paste(v1=dat$v1, v2=dat$v2)
而您定义的函数只接受一个 "x" 参数。所以第二部分相当于:
my_paste <- function(x) paste(x)
my_paste(v2=dat$v1, v1=dat$v2)
这会给您同样的错误,因为 v1 和 v2 未定义。
但是,您可以看到以下内容确实有效:
do.call(function(...) paste(...), dat)