data.table: сгруппировать, затем объединить с пользовательской функцией, возвращающей несколько новых столбцов - PullRequest
0 голосов
/ 23 января 2019

В data.table, как я могу сделать следующее:

  • Группировать таблицу по нескольким столбцам вместе
  • Затем передать каждую группу пользовательской функции агрегирования, которая:
  • Берет все столбцы из подмножества групповой таблицы и агрегирует их, возвращая несколько новых столбцов, которые будут добавлены в таблицу

Хитрость в том, чтобы сгенерировать несколько новых столбцов без вызова агрегации.функция более одного раза.

Пример:

library(data.table)
mtcars_dt <- data.table(mtcars)

returnsOneColumn <- function(dt_group_all_columns){
  "returned_value_1"
}

# works great, returns one new column as summary per group
mtcars_dt[,
          list( new_column_1 = returnsOneColumn(dt_group_all_columns= .SD) ),
          by = c("mpg", "cyl"),
          .SDcols = colnames(mtcars_dt)
          ]

returnsMultipleColumns <- function (dt_group_all_columns){
  list( "new_column_1" = "returned_value_1", 
        "new_column_2" = "returned_value_2"  )
}

# does not work: Ideally, I would like to have mpg, cyl, and several columns 
# generated from once calling returnsMultipleColumns
mtcars_dt[,
          list( returnsMultipleColumns(dt_group_all_columns = .SD) ),
          by = c("mpg", "cyl"),
          .SDcols = colnames(mtcars_dt)
          ]

# desired output should look like this
#
#     mpg cyl     new_column_1     new_column_2
# 1: 21.0   6 returned_value_1 returned_value_2
# 2: 22.8   4 returned_value_1 returned_value_2
# 3: 21.4   6 returned_value_1 returned_value_2
# 4: 18.7   8 returned_value_1 returned_value_2

Связанный:

Назначить несколько столбцов, используя: = в data.table, по группе

1 Ответ

0 голосов
/ 23 января 2019

Вы уже возвращаете список из функции. Вам не нужно перечислять их снова. Так что удалите list и получите код как показано ниже

mtcars_dt[,
           returnsMultipleColumns(dt_group_all_columns = .SD),
           by = c("mpg", "cyl"),
           .SDcols = colnames(mtcars_dt)
           ]
     mpg cyl     new_column_1     new_column_2
 1: 21.0   6 returned_value_1 returned_value_2
 2: 22.8   4 returned_value_1 returned_value_2
 3: 21.4   6 returned_value_1 returned_value_2
 4: 18.7   8 returned_value_1 returned_value_2
...