将通用列名称传递给R中的xtabs函数

时间:2015-08-13 15:18:12

标签: r

有没有办法将通用列名传递给R?

中的xtabs等函数

通常情况下,我尝试做类似的事情:

xtabs(weight ~ col, data=dframe)

colweight我的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)
}

正如我所说,我觉得这是一个丑陋的伎俩,但我可能对语言逻辑缺失了一些东西。

2 个答案:

答案 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"))