[英]Pass generic column names to xtabs function in R
有沒有辦法將通用列名傳遞給 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))
}
它失敗。 有沒有一種簡單的方法可以做類似的事情? 也許我在 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.