首先,让我们生成如下数据:
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)
)]
Run Code Online (Sandbox Code Playgroud)
然后我想使用自定义函数多次操作多列而无需手动输入。 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 ]
}
Run Code Online (Sandbox Code Playgroud)
您能告诉我一个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])
Run Code Online (Sandbox Code Playgroud)
请注意,如果将这个lapply分配给一个对象,您将获得一个data.tables迭代次数列表,或者在这种情况下为3。这将杀死内存,因为您实际上只对最终条目感兴趣。因此,只需运行代码而不将其分配给变量即可。现在,如果您不将其分配给任何内容,则将把每次迭代输出到控制台。因此,我建议invisible像这样围绕它:
invisible(lapply(1:n,function(i) data[,paste0(freture_old,"_",i):=lapply(.SD,add,i),.SDcols =freture_old]))
Run Code Online (Sandbox Code Playgroud)
希望对您有所帮助,并让我知道您是否需要在此答案中添加其他内容。祝好运!