Использование для l oop для итерации функции по нескольким переменным - PullRequest
0 голосов
/ 01 мая 2020

У меня есть таблица данных, которая выглядит примерно так, и я хочу применить к ней функцию 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)

Я хотел бы получить те же результаты, используя для l oop вместо lapply, к сожалению, я не очень хорош с циклами. Кто-нибудь может мне помочь? пока я пробовал следующее, но оно не работает должным образом.

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

Заранее большое спасибо за вашу помощь

1 Ответ

2 голосов
/ 01 мая 2020

Могли бы быть и более эффективные способы решения этой проблемы, но поскольку мы не знаем много о природе точной проблемы, то это попытка for l oop, которая воспроизводит тот же результат, что и 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
#...
#...
...