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

将通用列名传递给R中的xtabs函数,r,R,有没有办法将通用列名传递给R中的xtabs之类的函数 通常情况下,我会尝试这样做: xtabs(weight ~ col, data=dframe) 我的data.frame中有col和weight两列,weight是包含权重的列。它可以工作,但是如果我想将xtabs包装到一个函数中,并将列名作为参数传递给该函数,那么它将失败。因此,如果我这样做: xtabs.wrapper <- function(dframe, colname, weightname) { return(xt

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

通常情况下,我会尝试这样做:

xtabs(weight ~ col, data=dframe)
我的
data.frame
中有
col
weight
两列,
weight
是包含权重的列。它可以工作,但是如果我想将
xtabs
包装到一个函数中,并将列名作为参数传递给该函数,那么它将失败。因此,如果我这样做:

xtabs.wrapper <- function(dframe, colname, weightname) {
    return(xtabs(weightname ~ colname, data=dframe))
}

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

不确定这是否更漂亮,但这里有一种不使用
eval
定义函数的方法。。。它涉及通过
[]
访问
dframe
的正确列:

    xtabs.wrapper <- function(dframe, wname, cname) {
      tmp.wt <- dframe[,wname]
      tmp.col <- dframe[,cname]
      xt <- xtabs(tmp.wt~tmp.col)
      return(xt)
    }
我曾经这样做过:

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

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

xtabs.wrapper3有人建议我使用
eval
,但在我看来,这是一个丑陋的伎俩……我不知道这是否值得努力,或者这是否正是您想要的,但您可以考虑在函数中使用非标准求值()。。。但当我进一步阅读时,这可能与您已经收到的建议相同。我编辑了我的问题,添加了我根据这一建议尝试的内容,我发现这很不令人满意。。。但是谢谢你的评论!这正是我想要的,使用
dframe
[]
。我找不到正确的语法,但就是这样,谢谢!这比使用eval解决方案清洁得多。但是请注意,它不适用于data.table。请参见此处的data.table解决方案:
    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)  
}
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"))