Как применить функцию внутри вложенного вектора в data.table? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть data.table с вложенными полями, такими как:

library(data.table)

dt <- data.table(name_var = c("Abel","Abel", "Bill", "Bill", "Craig", "Craig", "Craig")
           , value_var = c(1,2,3,4,5,6,7)
           , car_color = c("B","B","B","G","G","G","G") 
)

dt_2 <- dt[,.(.(.SD)), by = name_var]

Функция ниже преобразует данные через указанную функцию:

transform_value <- function(x, fun, campo, ...) {
  x [, get (fun)(get(campo), ...)]
}

Например, можно вычислить среднее значение от value_var внутри вложенного V1:

dt_2[, mean_value:=lapply(V1, transform_value, "mean", "value_var")]

, которое корректно приводит к

   name_var           V1 mean_value
1:     Abel <data.table>        1.5
2:     Bill <data.table>        3.5
3:    Craig <data.table>          6

Однако, когда я пытаюсь вычислить журнал вложенного value_var Я получаю:

dt_2[, log_value:=lapply(V1, transform_value, "log", "value_var")]

, что приводит к:

   name_var           V1 mean_value                  log_value
1:     Abel <data.table>        1.5        0.0000000,0.6931472
2:     Bill <data.table>        3.5          1.098612,1.386294
3:    Craig <data.table>          6 1.609438,1.791759,1.945910

Хотя значения правильные, на самом деле я хотел бы иметь значения журнала рядом друг с другом внутри V1, например как:

> dt_2$V1[[1]]

   value_var car_color  log_value
1:         1         B  0.0000000
2:         2         B  0.6931472

Как мне это сделать?

Спасибо.

1 Ответ

1 голос
/ 11 марта 2020

mean работает, потому что возвращает скалярное значение при заданном векторе, тогда как log возвращает вектор. Вот вариант для изменения вашей функции:

transform_value <- function(x, fun, campo, ...) {
    a <- x[, c(.SD, .(match.fun(fun)(get(campo), ...)))]
    setnames(a, names(a)[length(a)], paste0(fun, "_value"))
}

dt_2[, V1 := lapply(V1, transform_value, "log", "value_var")]

dt_2$V1:

[[1]]
   value_var car_color log_value
1:         1         B 0.0000000
2:         2         B 0.6931472

[[2]]
   value_var car_color log_value
1:         3         B  1.098612
2:         4         G  1.386294

[[3]]
   value_var car_color log_value
1:         5         G  1.609438
2:         6         G  1.791759
3:         7         G  1.945910
...