gpt4 book ai didi

r - R 中的 do.call - Kaggle 入门脚本

转载 作者:行者123 更新时间:2023-12-04 12:27:50 25 4
gpt4 key购买 nike

当时,我正在查看一个 Kaggle 比赛的入门 R 脚本,我看到创建了这个函数来查找所有行的总和。这是代码:

#Function to sum across rows for variables defined
psum <- function(..., na.rm = FALSE) {
rowSums(do.call(cbind, list(...)), na.rm = na.rm)
}

有人可以解释一下这个函数中发生了什么吗?

此外,这与仅使用 rowSums 有何不同?

最佳答案

其实do.call 是不需要的。它本可以(并且应该)以如下更简单的方式编写:

psum2 <- function(..., na.rm = FALSE) rowSums(cbind(...), na.rm = na.rm)

psum2(BOD, BOD)
# [1] 18.6 24.6 44.0 40.0 41.2 53.6

psum(BOD, BOD) # same
# [1] 18.6 24.6 44.0 40.0 41.2 53.6

注意:一般来说,当我们不知道有多少参数将被传递给一个函数时,我们会使用 do.call,因此我们希望将参数列表传递给函数。以下内容:

L <- list(arg1, arg2, arg3)
do.call(f, L)

等同于:

f(arg1, arg2, arg3)

但在第一种情况下,我们可以动态创建 L 以便它可以具有任意数量的参数,而第二种情况则被硬编码为三个参数。

例如这段代码可以通过改变 n(其中 n 可以是 1、2、3、...)来改变:

n <- 3
L <- lapply(1:n, function(i) i * BOD) # create list of n components

rowSums(do.call(cbind, L))
[1] 55.8 73.8 132.0 120.0 123.6 160.8

对比这段代码被硬编码为 cbind 使用 3 个参数:

rowSums(cbind(BOD, 2*BOD, 3*BOD)) # hard coded
[1] 55.8 73.8 132.0 120.0 123.6 160.8

关于r - R 中的 do.call - Kaggle 入门脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33985782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com