繁体   English   中英

如何在自定义函数中使用lapply函数代替for循环,而自定义函数不在参数中进行矢量化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM