有没有办法将泛型列名传递给R中的xtabs之类的函数?
通常情况下,我想做的事情是:
xtabs(weight ~ col, data=dframe)有了col和weight的weight和data.frame的两列,weight是包含权重的列。它可以工作,但是如果我想将xtabs包装在一个函数中,并将列名作为参数传递给它,它就会失败。所以,如果我做了:
xtabs.wrapper <- function(dframe, colname, weightname) {
return(xtabs(weightname ~ colname, data=dframe))
}但失败了。有什么简单的方法来做类似的事情吗?也许我忽略了R逻辑的一些东西,但我觉得不能够将泛型变量传递给这样的函数似乎很烦人,因为我并不特别喜欢复制/粘贴。
任何帮助或评论都很感谢!
编辑:,正如在评论中提到的,有人建议我使用eval,并附带了以下解决方案:
xtabs.wrapper <- function(dframe, wname, cname) {
xt <- eval(parse(text=paste("xtabs(", wname, "~", cname, ", data=",
deparse(substitute(dframe)), ")")))
return(xt)
}正如我所说,在我看来,我是一个丑陋的诡计,但我可能错过了一些关于语言逻辑的东西。
发布于 2015-08-14 15:10:29
不确定这是否更漂亮,但这里有一种方法可以在不使用eval的情况下定义函数。它涉及通过dframe通过[]访问正确的列。
xtabs.wrapper <- function(dframe, wname, cname) {
tmp.wt <- dframe[,wname]
tmp.col <- dframe[,cname]
xt <- xtabs(tmp.wt~tmp.col)
return(xt)
}或者,您可以将该函数的内部缩短为:
xtabs.wrapper2 <- function(dframe, wname, cname) {
xt <- xtabs(dframe[,wname]~dframe[,cname])
return(xt)
}为了在这里显示它们是等价的,请举一个来自mtcars数据的例子:
data(mtcars)
xtabs(wt~cyl, mtcars)
xtabs.wrapper(mtcars, "wt", "cyl")
xtabs.wrapper2(mtcars, "wt", "cyl")发布于 2015-08-14 16:06:19
我做过一次:
creatextab<-function(factorsToUse, data)
{
newform<-as.formula(paste("Freq ~", paste(factorsToUse, collapse="+"), sep=""))
xtabs(formula= newform, drop.unused.levels = TRUE, data=data)
}显然,这是另一种形式,因为自由,但基本上..。您可以以字符串的形式生成孔,然后直接使用xtabs()。
发布于 2020-08-14 21:40:25
如果您希望n路交叉表和cname包含一个变量名字符串,那么您将需要以下内容:
xtabs.wrapper3 <- function(dframe, wname, cname) {
eval(cname)
formula <- paste0(wname, " ~ ", paste0(cname, collapse=" + ") )
xt <- xtabs(formula, data = dframe)
return(xt)
}
xtabs.wrapper3(mtcars, "wt", c("cyl", "vs"))https://stackoverflow.com/questions/31992301
复制相似问题