[英]How to use lapply function to instead of for loop in a custom function which is not vectorized in arguments
首先,让我们生成如下数据:
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.这将data.tables
内存,因为您实际上只对最终条目感兴趣。 因此,只需运行代码而不将其分配给变量。 现在,如果你不将它分配给任何东西,你将把每个迭代打印到控制台。 所以我建议的是在它周围包裹一个invisible
东西:
invisible(lapply(1:n,function(i) data[,paste0(freture_old,"_",i):=lapply(.SD,add,i),.SDcols =freture_old]))
希望这有帮助,如果您需要我在此答案中添加任何其他内容,请告诉我。 祝好运!
没有R“循环”的选项(引用自从最终它在某个某个级别的循环):
data[,
c(outer(freture_old, seq_len(n), paste, sep="_")) :=
as.data.table(matrix(outer(as.matrix(.SD), seq_len(n), add), .N)),
.SDcols=freture_old]
或等效于基数R:
setDF(data)
cbind(data, matrix(outer(as.matrix(data[, freture_old]), seq_len(n), add),
nrow(data)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.