首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将泛型列名传递给R中的xtabs函数

将泛型列名传递给R中的xtabs函数
EN

Stack Overflow用户
提问于 2015-08-13 15:18:12
回答 3查看 1.3K关注 0票数 0

有没有办法将泛型列名传递给R中的xtabs之类的函数?

通常情况下,我想做的事情是:

代码语言:javascript
复制
xtabs(weight ~ col, data=dframe)

有了colweightweightdata.frame的两列,weight是包含权重的列。它可以工作,但是如果我想将xtabs包装在一个函数中,并将列名作为参数传递给它,它就会失败。所以,如果我做了:

代码语言:javascript
复制
xtabs.wrapper <- function(dframe, colname, weightname) {
    return(xtabs(weightname ~ colname, data=dframe))
}

但失败了。有什么简单的方法来做类似的事情吗?也许我忽略了R逻辑的一些东西,但我觉得不能够将泛型变量传递给这样的函数似乎很烦人,因为我并不特别喜欢复制/粘贴。

任何帮助或评论都很感谢!

编辑:,正如在评论中提到的,有人建议我使用eval,并附带了以下解决方案:

代码语言:javascript
复制
xtabs.wrapper <- function(dframe, wname, cname) {
    xt <- eval(parse(text=paste("xtabs(", wname, "~", cname, ", data=",
                         deparse(substitute(dframe)), ")")))
    return(xt)
}

正如我所说,在我看来,我是一个丑陋的诡计,但我可能错过了一些关于语言逻辑的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-14 15:10:29

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

代码语言:javascript
复制
    xtabs.wrapper <- function(dframe, wname, cname) {
      tmp.wt <- dframe[,wname]
      tmp.col <- dframe[,cname]
      xt <- xtabs(tmp.wt~tmp.col)
      return(xt)
    }

或者,您可以将该函数的内部缩短为:

代码语言:javascript
复制
    xtabs.wrapper2 <- function(dframe, wname, cname) {
      xt <- xtabs(dframe[,wname]~dframe[,cname])
      return(xt)
    }

为了在这里显示它们是等价的,请举一个来自mtcars数据的例子:

代码语言:javascript
复制
    data(mtcars)
    xtabs(wt~cyl, mtcars)
    xtabs.wrapper(mtcars, "wt", "cyl")
    xtabs.wrapper2(mtcars, "wt", "cyl")
票数 2
EN

Stack Overflow用户

发布于 2015-08-14 16:06:19

我做过一次:

代码语言:javascript
复制
    creatextab<-function(factorsToUse, data)
    {      
            newform<-as.formula(paste("Freq ~", paste(factorsToUse, collapse="+"), sep=""))
           xtabs(formula= newform, drop.unused.levels = TRUE, data=data)  
}

显然,这是另一种形式,因为自由,但基本上..。您可以以字符串的形式生成孔,然后直接使用xtabs()

票数 0
EN

Stack Overflow用户

发布于 2020-08-14 21:40:25

如果您希望n路交叉表和cname包含一个变量名字符串,那么您将需要以下内容:

代码语言:javascript
复制
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"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31992301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档