gpt4 book ai didi

r - 如何在未在参数中向量化的自定义函数中使用 lapply 函数代替 for 循环

转载 作者:行者123 更新时间:2023-12-01 09:07:34 24 4
gpt4 key购买 nike

首先,让我们生成这样的数据:

library(data.table)
data <- data.table(date = as.Date("2015-05-01")+0:299)
set.seed(123)
data[,":="(
a = round(30*cumprod(1+rnorm(300,0.001,0.05)),2),
b = rbinom(300,5000,0.8)
)]

然后我想用我的自定义函数多次操作多个列而不需要手动输入。比如我的自定义函数是add <- function(x,n) (x+n)

我提供的 for 循环代码如下:

add <- function(x,n) (x+n)
n <- 3
freture_old <- c("a","b")
for(i in 1:n ){
data[,(paste0(freture_old,"_",i)) := add(.SD,i),.SDcols =freture_old ]
}

你能告诉我一个lapply吗?版本而不是 for 循环?

最佳答案

如果您只想使用 lapply 循环而不是 for 循环,那么您真的不需要做太多更改。对于 data.table 对象,它甚至更容易,因为每次迭代都会更改 data.table,而无需将副本保存到全局环境。我为抑制输出到控制台而添加的一件事是在它周围包裹一个 invisible

lapply(1:n,function(i) data[,paste0(freture_old,"_",i):=lapply(.SD,add,i),.SDcols =freture_old])

请注意,如果您将此 lapply 分配给一个对象,您将获得 data.tables 的列表,其大小为迭代次数或在本例中为 3。这会消耗内存,因为您确实只对最后的条目感兴趣。因此,只需运行代码而不将其分配给变量。现在,如果您不将它分配给任何东西,您将把每次迭代都打印到控制台上。所以我的建议是像这样在它周围包裹一个invisible:

invisible(lapply(1:n,function(i) data[,paste0(freture_old,"_",i):=lapply(.SD,add,i),.SDcols =freture_old]))

希望这对您有所帮助,如果您需要我在此答案中添加任何其他内容,请告诉我。祝你好运!

关于r - 如何在未在参数中向量化的自定义函数中使用 lapply 函数代替 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956303/

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