我正在学习如何运行函数。希望这是个容易回答的问题。
我有一个 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))
鼎力相助
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
请注意,由于你使用了 :=
所以您不需要重新分配输出的