![](/img/trans.png)
[英]R data.table way to create summary statistics table with self-defined function
[英]A simple reproducible example to pass arguments to data.table in a self-defined function in R
我已經在谷歌上搜索了這個答案幾個小時。 很多人都問過類似的問題,但我沒有找到一個足夠簡單的問題或一個直截了當的答案。 這是我的方法:
假設我想在data.table
中做一個簡單的分組:
library(data.table)
mtcars = data.table(mtcars)
mtcars[,sum(mpg), gear]
# Here are the results
# gear V1
#1: 4 294.4
#2: 3 241.6
#3: 5 106.9
但是,如果我使用自定義的 function 來執行此操作:
zz = function(data, var, group){
return(data[,sum(var), group])
}
zz(mtcars, mpg, gear)
我收到一條錯誤消息:
eval 中的錯誤(bysub、parent.frame()、parent.frame()):未找到 object 'gear'
我嘗試了substitute
、 eval
、 quote
和其他解決方案,但它們都不起作用。 我想知道是否有人可以對此給出更直接的解決方案和解釋。
謝謝你,萬聖節快樂!
如果我們使用未引用的eval
,請substitute
並評估
zz <- function(data, var, group){
var <- substitute(var)
group <- substitute(group)
setnames(data[, sum(eval(var)), by = group],
c(deparse(group), deparse(var)))[]
# or use
# setnames(data[, sum(eval(var)), by = c(deparse(group))], 2, deparse(var))[]
}
zz(mtcars, mpg, gear)
# gear mpg
#1: 4 294.4
#2: 3 241.6
#3: 5 106.9
雖然不完美,但...
論點可能會有所幫助:
zz = function(dt, ...){
return(dt[...])
}
zz(mtcars, , sum(mpg), gear)
gear V1
1: 4 294.4
2: 3 241.6
3: 5 106.9
我真的不明白寫一個 function 沒有引用 arguments 的意義。 為什么不直接使用 data.table 語法呢?
如果您想編寫 function ,則采用列名的字符向量更有意義,因為這比符號更具可編程性(考慮使用setkey
與setkeyv
編程或編寫函數以使用aes
與aes_string
)缺點是function 的內部很亂,需要 eval(parse(text=.))) NSE 才能使 GForce 正常工作,但 function 接口更具可擴展性。
zz = function(data, var, group){
eval(parse(text=paste0("data[,sum(",var,"),by=",group,"]")))
}
zz(mtcars, "mpg", "gear")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.