r - 在多个变量上传递函数
问题描述
我正在学习如何运行函数。希望这将是一个容易回答的问题。
我有一个df
并且我想将函数传递给w
df.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))
非常感谢你的帮助
解决方案
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
请注意,您在使用后更新数据框,:=
因此您无需重新分配输出
推荐阅读
- windows - 如何在 Windows 上抑制控制台窗口?
- jpa - 通过将 ID 传递给 IN 子句的 JPQL 订单实体
- python - 当参数包含特殊字符或空格时,/profile/preview/ 处的 NoReverseMatch
- android - 带有 MutableContextWrapper VS 片段的自定义视图
- sql - 如何从字符串日期c#中获取年份
- c - 将文本文件读入C中的数组
- java - AndroidStudio 无法运行单个参数化测试
- intel - 英特尔内置显卡 (Intel Iris Plus Graphics 655) 上的 OpenACC
- xero-api - Xero API中发票的Oauth2范围?
- python - 如何在 Python 中通过 imap/pop3 识别 Outlook“消息 ID”?