r - 以编程方式将不同的函数应用于 data.table R 中的不同列

标签 r data.table grouping apply mapply

我需要使用 data.table 以编程方式将不同的函数应用于不同的列和分组依据.

如果列和函数是已知的,我会这样做:

library(data.table)
DT = data.table(id = rep(letters[1:3], each=3),
                v1 = rep(c(2, 3, 4), each=3),
                v2 = rep(c(5, 10, 15), each=3))
DT
#>    id v1 v2
#> 1:  a  2  5
#> 2:  a  2  5
#> 3:  a  2  5
#> 4:  b  3 10
#> 5:  b  3 10
#> 6:  b  3 10
#> 7:  c  4 15
#> 8:  c  4 15
#> 9:  c  4 15
DT[, .(v1=mean(v1), v2=sum(v2)), keyby=.(id)]
#>    id v1 v2
#> 1:  a  2 15
#> 2:  b  3 30
#> 3:  c  4 45

但我想通过传递列名及其特定功能来做到这一点:
aggregate_functions = list(v1=mean, v2=sum)
col_selection = c('v1', 'v2')

我写了这样的东西,我想不出将列名传递给 lapply 的方法:
DT[, lapply(.SD, 
            aggregate_functions[[col_name]] # some way of selecting the right function from aggregate_functions
            ), 
   .SDcols = col_selection, 
   by=id]

我也试过 meltdcast ,但后者将所有函数应用于所有列:

library(data.table)
DT = data.table(id = rep(letters[1:3], each=3),
                v1 = rep(c(2, 3, 4), each=3),
                v2 = rep(c(5, 10, 15), each=3))
DTm = melt(DT, meaure.vars=col_selection, id.vars='id')
DTm
#>     id variable value
#>  1:  a       v1     2
#>  2:  a       v1     2
#>  3:  a       v1     2
#>  4:  b       v1     3
#>  5:  b       v1     3
#>  6:  b       v1     3
#>  7:  c       v1     4
#>  8:  c       v1     4
#>  9:  c       v1     4
#> 10:  a       v2     5
#> 11:  a       v2     5
#> 12:  a       v2     5
#> 13:  b       v2    10
#> 14:  b       v2    10
#> 15:  b       v2    10
#> 16:  c       v2    15
#> 17:  c       v2    15
#> 18:  c       v2    15
DTc = dcast(DTm, id~variable, fun.aggregate=list(sum, mean))
DTc
#>    id value_sum_v1 value_sum_v2 value_mean_v1 value_mean_v2
#> 1:  a            6           15             2             5
#> 2:  b            9           30             3            10
#> 3:  c           12           45             4            15

我可以以编程方式选择和重命名相关列(在本例中为 3 和 4),但这看起来不是一种有效的方法。

当然我可以有一个循环来完成这项工作并合并结果,但我正在寻找一个 data.table道路。

感谢您的回答,也感谢 data.table 的团队.

创建于 2019-11-26 由 reprex package (v0.3.0)

最佳答案

在我发布问题后,链接到 this回答者 @Uwe出现在包含我正在寻找的结果的右侧框中。我调整了它以匹配我的示例:

library(magrittr)
library(data.table)
DT = data.table(id = rep(letters[1:3], each=3),
                v1 = rep(c(2, 3, 4), each=3),
                v2 = rep(c(5, 10, 15), each=3))
aggregate_functions = list(v1='mean', v2='sum')
col_selection = c('v1', 'v2')
aggregate_functions %>%
  names() %>% 
  lapply(
    function(col_selection) lapply(
      aggregate_functions[[col_selection]], 
      function(.fct) sprintf("%s = %s(%s)", col_selection, .fct, col_selection))) %>% 
  unlist() %>% 
  paste(collapse = ", ") %>% 
  sprintf("DT[, .(%s), by = id]", .) %>% 
  parse(text = .) %>% 
  eval()
#>    id v1 v2
#> 1:  a  2 15
#> 2:  b  3 30
#> 3:  c  4 45

我仍然会对'all in data.table感兴趣' 解决方案。

创建于 2019-11-26 由 reprex package (v0.3.0)

关于r - 以编程方式将不同的函数应用于 data.table R 中的不同列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59059743/

相关文章:

python - pandas stack and unstack performance reduced after dataframe compression 并且比 R 的 data.table 差很多

algorithm - 分组、排序和返回前 N 个结果的有效方法

R Markdown : hide spoiler text (hover over text element)

R:如何检查向量元素是否相同

r - 有没有比 fread() 更快的方法来读取大数据?

ios - 从数组到字典分组

r - 使用dplyr按多个变量分组时计算变量的比例

r - 通过自相关法计算音高误差

r - 将图像对象列表传递给 R magick 函数而不是向量

r - fread - 跳过以特定字符开头的行 - "#"