我可以获得由其他变量分层的变量的摘要,如下所示:
require(data.table)
DT <- data.table(mtcars)
var_work <- "hp"
by_vars <- c("cyl", "carb")
ans_1 <- cube(DT, j = as.list(quantile(get(var_work))), by = by_vars)
ans_1
cyl carb 0% 25% 50% 75% 100%
1: 6 4 110 110.00 116.5 123.00 123
2: 4 1 65 66.00 66.0 93.00 97
3: 6 1 105 106.25 107.5 108.75 110
4: 8 2 150 150.00 162.5 175.00 175
5: 8 4 205 218.75 237.5 245.00 264
6: 4 2 52 69.25 93.0 105.50 113
7: 8 3 180 180.00 180.0 180.00 180
8: 6 6 175 175.00 175.0 175.00 175
9: 8 8 335 335.00 335.0 335.00 335
10: 6 NA 105 110.00 110.0 123.00 175
11: 4 NA 52 65.50 91.0 96.00 113
12: 8 NA 150 176.25 192.5 241.25 335
13: NA 4 110 123.00 210.0 241.25 264
14: NA 1 65 66.00 93.0 101.00 110
15: NA 2 52 92.00 111.0 150.00 175
16: NA 3 180 180.00 180.0 180.00 180
17: NA 6 175 175.00 175.0 175.00 175
18: NA 8 335 335.00 335.0 335.00 335
19: NA NA 52 96.50 123.0 180.00 335
Run Code Online (Sandbox Code Playgroud)
接下来,我想编写一个辅助函数来实现上面显示的内容,但是会产生错误:
my_fun <- function(table_work, var_w, by_v) {
tab_out <- cube(table_work, j = as.list(quantile(get(var_w))), by = by_v)
return(tab_out)
}
ans_2 <- my_fun(table_work = DT, var_w = var_work, by_v = by_vars)
Error in get(var_w) : object 'var_w' not found
Run Code Online (Sandbox Code Playgroud)
我在一些相关的博客(例如,使用 data.table 的高级提示和技巧)和帖子(例如,由Henrik、frankc等撰写)中搜索了答案,并尝试了 quote()、eval()、get() 的不同组合、assign() 等在“my_fun”中,但对我没有任何作用。
问题是:我应该如何纠正“my_fun”辅助函数,使其工作并产生与 ans_1 相同的结果?
R version 3.6.1 (2019-07-05)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.5
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib
locale:
[1] en_AU.UTF-8/en_AU.UTF-8/en_AU.UTF-8/C/en_AU.UTF-8/en_AU.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Matrix_1.2-18 fst_0.9.0 data.table_1.12.8
loaded via a namespace (and not attached):
[1] compiler_3.6.1 parallel_3.6.1 Rcpp_1.0.3 grid_3.6.1 lattice_0.20-38
Run Code Online (Sandbox Code Playgroud)
data.table:::cube.data.table当阅读和 的代码时data.table:::groupingsets.data.table,j已经使用 NSE 计算了该参数。因此,由于无法传递到as.name(var_work)的环境参数substitute,该函数将会失败。
作为解决方法,您可以使用.SDcols:
library(data.table)
DT <- data.table(mtcars)
var_work <- "hp"
by_vars <- c("cyl", "carb")
my_fun <- function(table_work, var_w, by_v) {
cube(table_work, j=as.list(quantile(.SD[[1L]])), by=by_v, .SDcols=var_w)
}
ans_2 <- my_fun(table_work = DT, var_w = var_work, by_v = by_vars)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
268 次 |
| 最近记录: |