首页 > 解决方案 > 在多个变量上传递函数

问题描述

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

我有一个df并且我想将函数传递给wdf.xml 中的一些变量。

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))

非常感谢你的帮助

标签: rfunction

解决方案


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

请注意,您在使用后更新数据框,:=因此您无需重新分配输出


推荐阅读