簡體   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