首页 > 解决方案 > 使用 for 循环在多个变量上迭代函数

问题描述

我有一个看起来像这样的数据表,我想应用到它的功能f

library(data.table)

dt <- data.table(id= c(1,1,1,2,2,2,3,3,3), year=c(1,2,3,1,2,3,1,2,3),y = rnorm(9), x1 = rnorm(9), x2 = c(0,0,0,0,1,0,1,1,1),c2 = rnorm(9))

f <- function(data, var1, var2){
  data[,(paste("times",var1,var2, sep = "_")) := get(var1)*get(var2)]
}

我想应用f多个变量获得类似于以下结果的结果:

vars<-c("x1","x2","c2")
dt2<-lapply(vars, function(x) f(dt,"y", x))
dt2<-do.call(rbind,dt2)

我想使用for 循环而不是获得相同的结果lapply,不幸的是,我不擅长循环。有人可以帮我吗?到目前为止,我尝试了以下方法,但它不能正常工作。

for(i in vars) {
  dt<-f(dt,"y",i)
}

非常感谢您的帮助

标签: rfunctionloopsdata.table

解决方案


可能有更好的方法来解决这个问题,但由于我们对确切问题的性质知之甚少,这里是一个for循环尝试,它重现与lapply.

library(data.table)   

list_df <- vector('list', length(vars))   
for(i in seq_along(vars)) list_df[[i]] <- f(dt,'y',vars[i])

rbindlist(list_df)

#    id year       y     x1 x2     c2 times_y_x1 times_y_x2 times_y_c2
# 1:  1    1 -0.5605 -0.446  0  0.701     0.2498      0.000    -0.3931
# 2:  1    2 -0.2302  1.224  0 -0.473    -0.2818      0.000     0.1088
# 3:  1    3  1.5587  0.360  0 -1.068     0.5608      0.000    -1.6644
# 4:  2    1  0.0705  0.401  0 -0.218     0.0283      0.000    -0.0154
# 5:  2    2  0.1293  0.111  1 -1.026     0.0143      0.129    -0.1326
# 6:  2    3  1.7151 -0.556  0 -0.729    -0.9533      0.000    -1.2501
#...
#...

推荐阅读