Я пытаюсь посчитать количество пользователей для разных когорт. Я нашел способ сделать это с помощью 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
, таким образом все правильно вычисляется, но имена в кавычках приводятся в кавычках, что неприятно и приводит к ошибкам. Я попробовал методы, предложенные здесь , а также ответ и комментарии этого ТАКОГО вопроса . Но ни один из них, похоже, тоже не работает. Что я делаю не так?