【发布时间】:2019-05-02 16:04:52
【问题描述】:
首先,让我们生成如下数据:
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 循环吗?
【问题讨论】:
-
for循环有什么问题?注意:lapply也是一个循环。 -
在 R 中,
lapply循环似乎比for循环运行得更快。 -
我同意 Parfait 在此处重新使用 for 循环,尽管您应该使用 lapply 来迭代 .SD,例如
for (i in 1:n) data[, paste0(freture_old,"_",i) := lapply(.SD, add, i), .SDcols=freture_old][] -
@Frank - 是 +1 用于迭代
data.table中的.SD,我将修改我的答案以包括它,因为这确实是使用data.table的速度因素所在.而且我倾向于同意小 n 使用@Frank 的解决方案和我的解决方案之间没有真正的速度差异。但是,一旦 n >10000,在data.table之外使用lapply而不是在for循环之外使用lapply会显着提高速度。 -
@Frank 你能解释一下为什么我应该使用 lapply 来迭代 .SD 吗?我知道这两种方法可以工作,但我不知道哪个更好。我期待着您的回答。
标签: r data.table