Передайте имя столбца и аргумент группы как переменные в data.table

Я пытаюсь подсчитать количество пользователей для разных когорт. Я нашел способ сделать это с помощью dplyr, но я хотел бы реализовать решение с использованием data.table, чтобы повысить эффективность и в качестве упражнения.

Библиотеки, которые я использую в этом примере:

   library(dplyr)
   library(magrittr)
   library(data.table)

Допустим, у меня есть этот df:

df <- data.frame(V1 = sample(c("a", "b", "c"), 11, TRUE), 
                 V2 = sample(c("2016", "2017", "2018"), 11, TRUE),
                 V3 = sample(seq(1:3), 11, TRUE), 
                 V4 = sample(seq(1:3), 11, TRUE),
                 Id = sample(seq(1:5), 11, TRUE))

Решение с использованием dplyr:

for (grp in c("V1", "V2", "V3", "V4")) {
    col <- paste0(grp, "_user_cnt")
    df %<>%
    group_by_(grp) %>%
    mutate(!!col := n_distinct(Id)) %>%
    ungroup()
}

И мой подход к data.table будет примерно таким:

DT <- data.table(df)
for (grp in c("V1", "V2", "V3", "V4")) {
    col <- paste0(grp, "_user_cnt")
    DT[, (deparse(col)) := n_distinct(Id), by = get(grp)]
}

Проблема в том, что я не могу найти способ правильно передать col и grp, таким образом все вычисляется правильно, но имена столбцов цитируются, что неприятно и приводит к ошибкам. Я пробовал методы, предложенные здесь, а также ответ и комментарии этот ТАК вопрос. Но ни один из них, похоже, тоже не работает. Что я делаю неправильно?

Вы можете получить желаемые результаты просто с DT[, (col) := n_distinct(Id), by = grp]. Вы получаете кавычки, потому что deparse(col) оценивает что-то вроде «"V1_user_cnt"» (внутренняя кавычка является частью строки).

mt1022 31.10.2018 12:33

В data.table вместо n_distinct используется uniqueN

Frank 31.10.2018 15:04
1
2
50
0

Другие вопросы по теме