有没有办法将通用列名传递给R?
中的xtabs
等函数
通常情况下,我尝试做类似的事情:
xtabs(weight ~ col, data=dframe)
col
和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)
}
正如我所说,我觉得这是一个丑陋的伎俩,但我可能对语言逻辑缺失了一些东西。
答案 0 :(得分:2)
不确定这是否更漂亮,但这是一种在不使用eval
的情况下定义函数的方法...它涉及通过dframe
访问[]
的正确列:< / p>
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")
答案 1 :(得分:0)
如果要使用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"))