在多个变量上传递一个函数

问题描述 投票:0回答:1

我正在学习如何运行函数。希望这是个容易回答的问题。

我有一个 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))

鼎力相助

r function
1个回答
1
投票

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

请注意,由于你使用了 := 所以您不需要重新分配输出的

© www.soinside.com 2019 - 2024. All rights reserved.