我在理解如何创建用户定义函数时遇到了一般性问题,该函数可以接受变量作为可以在定义函数内操作的参数。我想创建一个函数,我可以将变量作为参数传递给内部函数进行操作。似乎我想要使用的许多函数都需要c()
运算符,它需要在参数周围引用。
所以我的函数必须能够将数据框中的变量名称传递给c()
的引号和需要引用字符串的其他函数。我在paste0
,paste
和cat(x)
上阅读了很多帖子,但我无法弄清楚如何彻底解决我的问题。
这是一个简单的数据集和缩短的代码,以帮助解决问题。在这里,我只想提供一个数据帧和三个变量。该函数应为x
和z
变量的每个组合提供y位置变量的均值。生成的聚合表应该具有作为列标题作为XTABAR参数提供的变量的名称。
n=50
DataTest = data.frame( xcol=sample(1:3, n, replace=TRUE), ycol = rnorm(n, 5, 2), Catg=letters[1:5])
XTABAR<- function(DS,xcat,yvar,group){
library(plyr)
#library(ggplot2)
#library(dplyr)
#library(scales)
localenv<-environment()
gg<-data.frame(DS,x=DS[,xcat],y=DS[,yvar],z=DS[,group] )
cnames<-colnames(gg)
ag.gg<-aggregate(gg$y, by=list(gg$x,gg$z),FUN=mean)
colnames(ag.gg)<-c(cat('"',cnames[1],'"'),cat('"',cnames[2],'"'),cat('"',cnames[3],'"'))
return(ag.gg)
}
XTABAR(DataTest,"xcol","ycol","Catg")
这段代码尽可能地解决了这个简单的问题。我不知道如何从列名中删除引号,也不知道如何去除NA。
感谢您对逻辑和/或代码的任何帮助。
答案 0 :(得分:1)
尝试以下方法。我不太清楚引用这些名字的愿望,但我们在下面的代码中放置了星星。如果不需要,请删除setNames
语句。
XTABAR <- function(DS, xcat, yvar, group) {
ag <- aggregate(DS[yvar], DS[c(xcat, group)], mean)
setNames(ag, paste0("*", names(ag), "*"))
}
测试它:
XTABAR(DataTest, "xcol", "ycol", "Catg")
,并提供:
*xcol* *Catg* *ycol*
1 1 a 5.700938
2 2 a 5.292628
3 3 a 5.204395
4 1 b 4.054289
5 2 b 5.119659
6 3 b 4.050799
7 1 c 2.937309
8 2 c 5.696256
9 3 c 6.773029
10 1 d 5.323572
11 2 d 3.430644
12 3 d 4.892041
13 1 e 4.024070
14 3 e 5.038122
答案 1 :(得分:0)
为此,我大量使用eval(parse(text=))
。它评估字符串,就像它是一个命令一样。例如:
> x <- "5 + 5"
> eval(parse(text=x))
[1] 10
使用您的示例,如果您将参数输入为字符串,这应该可以使用:
XTABAR<- function(DS,xcat,yvar,group){
library(plyr)
#library(ggplot2)
#library(dplyr)
#library(scales)
var1 <- eval(parse(text=paste(DS, "$", xcat, sep="")))
var2 <- eval(parse(text=paste(DS, "$", yvar, sep="")))
var3 <- eval(parse(text=paste(DS, "$", group, sep="")))
localenv<-environment()
gg<-data.frame(x=var1, y=var2, z=var3)
cnames<-colnames(gg)
ag.gg<-aggregate(gg$y, by=list(gg$x,gg$z),FUN=mean)
colnames(ag.gg)<-c(cat('"',cnames[1],'"'),cat('"',cnames[2],'"'),cat('"',cnames[3],'"'))
return(ag.gg)
}
我会继续前进,并期待批评我的回答。
> require(fortunes)
Loading required package: fortunes
> fortune(106)
If the answer is parse() you should usually rethink
the question.
-- Thomas Lumley
R-help (February 2005)
先生。在这种情况下,Lumley可能是正确的。可能有更简单的解决方案,但这至少应该让你前进。
答案 2 :(得分:0)
要设置列名称,请使用colnames(ag.gg) <- c(xcat, yvar, group)
。