Передать функцию для нескольких переменных - PullRequest
0 голосов
/ 30 апреля 2020

Я учусь запускать функции. Надеюсь, на этот вопрос было бы легко ответить.

У меня есть df, и я хочу передать функцию w некоторым переменным в df.

df <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=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))
library(data.table)
library(dplyr)

w<-function(data,var1,var2){
  x <- substitute(var1)
  y <- substitute(var2)
  data<-setDT(data)[,paste("times",(var1), (var2), sep = "_"):=eval(var1)*eval(var2)]
}

df2<- w(df,y,x1)  

Когда я применяю функцию к одной переменной, функция работает. но я хотел бы применить его к ряду переменных в моем фрейме данных, но по какой-то причине функция завершается ошибкой, когда я пытаюсь применить его к нескольким переменным одновременно. Кто-нибудь знает, как я мог заставить его работать?

Пока я пробовал следующее

vars<-c("x1","x2")
df3<- lapply(vars, function(x) w(df,y, x))

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

1 Ответ

1 голос
/ 30 апреля 2020

data.table хорошо работает с именами переменных. Вы используете get, чтобы снять кавычки и оценить их в области действия объекта data.table. Я написал сообщение в блоге именно на эту тему, если оно может вам помочь.

df <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=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))

library(data.table)
setDT(df)

Ваша функция может быть упрощена до:

w <- function(data, var1, var2){
  if (!inherits(data, "data.table")){
        setDT(data)
  }
  data[,(paste("times",var1,var2, sep = "_")) := get(var1)*get(var2)]
}

И вы звоните используя имена переменных

vars<-c("x1","x2")
lapply(vars, function(x) w(df,"y", x))


df
   id time           y         x1 x2          c2 times_y_x1 times_y_x2
1:  1    1 -0.81438357  0.4493933  0 -0.39143328 -0.3659786  0.0000000
2:  1    2  0.36358498 -1.3574671  0  0.06062278 -0.4935547  0.0000000
3:  1    3  0.04049807  0.2860555  0  1.58123937  0.0115847  0.0000000
4:  2    1  0.15490901 -0.8654069  0 -1.09874917 -0.1340593  0.0000000
5:  2    2 -0.87899821  0.2863604  1 -0.73161360 -0.2517103 -0.8789982
6:  2    3  0.37881104  1.6135654  0  1.30268569  0.6112364  0.0000000
7:  3    1 -0.72990680  0.5867623  1  0.41856548 -0.4282818 -0.7299068
8:  3    2 -0.53344035  0.5073415  1  0.64326809 -0.2706364 -0.5334404
9:  3    3 -0.27674109 -0.5226920  1 -2.28723895  0.1446504 -0.2767411

Обратите внимание, что вы обновляете свой фрейм данных, поскольку используете :=, поэтому вам не нужно переназначать вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...