【问题标题】:Using a for loop to iterate a function over multiple variables使用 for 循环在多个变量上迭代函数
【发布时间】:2020-08-15 18:56:00
【问题描述】:

我有一个看起来像这样的数据表,我想对其应用函数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)
}

非常感谢您的帮助

【问题讨论】:

  • 当您没有可重现的错误示例时,很难提供帮助
  • 是的,我完全理解,不幸的是,我不确定 lapply 方法出了什么问题,因为它适用于其他数据。这就是为什么我正在寻找一种使用 for 循环的不同方法的原因。任何可以使用 for 循环在示例的 dt2 中重现结果的答案都可以。我将更新问题以使其更清楚

标签: r function loops data.table


【解决方案1】:

可能有更好的方法来解决这个问题,但由于我们对确切问题的性质知之甚少,因此这里是 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
#...
#...

【讨论】:

  • 非常感谢。它运作良好!请问您为什么必须使用seq_along() 命令?
  • seq_along 创建一个从 1 到 length(vars) 的序列。我们在这里使用它来存储列表索引号,以便我们可以将每个数据帧保存为list_df[[1]]list_df[[2]] 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多