繁体   English   中英

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

[英]Pass generic column names to xtabs function in R

有没有办法将通用列名传递给 R 中的xtabs函数?

通常,我正在尝试执行以下操作:

xtabs(weight ~ col, data=dframe)

我的data.frame colweight两列, 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)
}

正如我所说,我在我看来是一个丑陋的把戏,但我可能缺少关于语言逻辑的一些东西。

不确定这是否更漂亮,但这里有一种不使用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")

我做过一次:

    creatextab<-function(factorsToUse, data)
    {      
            newform<-as.formula(paste("Freq ~", paste(factorsToUse, collapse="+"), sep=""))
           xtabs(formula= newform, drop.unused.levels = TRUE, data=data)  
}

显然,由于 Freq,这是一种不同的形式,但基本上……您可以将论坛生成为字符串,然后您只需直接使用xtabs()

如果您想要一个 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"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM