我的Shiny应用程序中有一个部分可以生成一个列表。
列表的名称是我们将计算的数据帧的列名,列表项包含我们想要的计算
希望这样做:…
为了将Uwe的答案变成一个函数我做了这个:
Summarystats <- function(statlist, dataframe, group) { statlist %>% names() %>% lapply( function(.col) lapply( statlist[[.col]], function(.fct) sprintf("%s.%s = %s(%s)", .col, .fct, .fct, .col))) %>% unlist() %>% paste(collapse = ", ") %>% sprintf("as.data.table(dataframe)[, .(%s), by = group]", .) %>% parse(text = .) %>% eval() }
现在我可以致电:
Summarystats(mylist, mtcars, 'cyl')
允许我为我的Shiny App中的任何数据帧和用户想要的分组调用汇总表。
如果我理解正确,问题不在于此 闪亮 首先,但关于如何将不同的聚合函数应用于a的特定列 data.table 。
列的名称和要应用的函数以列表形式给出 mylist 这是由闪亮的应用程序创建的。
mylist
在我采用的各种方法中,我的选择是 计算语言 ,即从内容创建一个完整的表达式 mylist 并评估它:
library(magrittr) library(data.table) mylist %>% names() %>% lapply( function(.col) lapply( mylist[[.col]], function(.fct) sprintf("%s.%s = %s(%s)", .col, .fct, .fct, .col))) %>% unlist() %>% paste(collapse = ", ") %>% sprintf("as.data.table(mtcars)[, .(%s), by = cyl]", .) %>% parse(text = .) %>% eval()
这产生了预期的结果
cyl disp.sum disp.mean hp.sd drat.sum drat.mean wt.max 1: 6 1283.2 183.3143 24.26049 25.10 3.585714 3.460 2: 4 1156.5 105.1364 20.93453 44.78 4.070909 3.190 3: 8 4943.4 353.1000 50.97689 45.21 3.229286 5.424
解析的字符串由。创建
mylist %>% names() %>% lapply( function(.col) lapply( mylist[[.col]], function(.fct) sprintf("%s.%s = %s(%s)", .col, .fct, .fct, .col))) %>% unlist() %>% paste(collapse = ", ") %>% sprintf("as.data.table(mtcars)[, .(%s), by = cyl]", .)
并且看起来好像是手动编码的:
[1] "as.data.table(mtcars)[, .(disp.sum = sum(disp), disp.mean = mean(disp), hp.sd = sd(hp), drat.sum = sum(drat), drat.mean = mean(drat), wt.max = max(wt)), by = cyl]"
为了演示, mylist 提供“硬编码”:
mylist <- list( disp = c("sum", "mean"), hp = "sd", drat = c("sum", "mean"), wt = "max")