将通用列名传递给R中的xtabs函数
有没有办法将通用列名传递给R中的将通用列名传递给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
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"))