列列表上的不同功能,并使用data.table自动生成新的列名

时间:2019-03-11 09:40:49

标签: r shiny data.table

我的Shiny应用程序中有一个部分可以生成列表。

列表的

名称是我们将基于dataframe计算的列名称, 列表项包含我们想要的计算

希望这样做:
apply到所有list的名称:
listnamecolumn)x在function上计算n,m,o df column x
并将结果列命名为'x.n',即'cyl.mean','mpg.sum'
在这种情况下,可以获取dataframe个汇总统计信息PER GROUP(mtcars $ cyl)

它与this问题相关,但是示例datalist名称中使用了单独的column,而apply使用了相同的{{1 }}来自其他functions的所有columns。我希望将list的{​​{1}} apply组转移到不同的unique

我的应用程序弹出的列表如下:

functions

预期输出:

columns

创建列表的闪亮小应用程序:

mylist


$disp
[1] "sum"  "mean"

$hp
[1] "sd"

$drat
[1] "sum"  "mean"

$wt
[1] "max"

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么问题首先不是关于,而是关于如何将不同的聚合函数应用于的特定列。

列名和要应用的功能以列表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")