R // datatable // совокупное количество уникальных имен - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть большая таблица (40 млн. Х 16 столбцов), и я хочу рассчитать совокупное количество людей в группе (ID) до даты каждой строки. Я должен быть решением для data.table, мой опыт показывает, что все остальное слишком медленно, учитывая размер данных.

Мои данные:

names = c("Anna", "Anna", "Hans", "Karl", "Karl", "Maria", "Sara", "Sara") 
ID = c("A", "A", "A", "A", "A", "B", "B", "B")
timestamp = c("2019-11-01", "2019-12-01", "2019-12-20", "2020-01-01", "2020-02-04", "2019-12-01", "2020-01-01", "2020-02-04")

df = cbind(timestamp, ID, names) %>% 
  as.data.table

Результат, который я ищу:

cum_count = c(1,1,2,3,3,1,2,2)

Моя попытка, которая не работает:

df[, `:=` (cum_count = cumsum(names) - 1), by = ID]

1 Ответ

0 голосов
/ 16 апреля 2020

Вот опция в data.table:

DT[, cum_count := {
        ri <- rleid(x)

        glast <- which(ID!=shift(ID)) - 1L
        d <- replace(rep(NA_integer_, .N), glast + 1L, ri[glast])
        d <- nafill(replace(d, 1L:glast[1L], 0L), "locf")

        ri - d
    }]

данных (я изменил столбец names на x, чтобы избежать путаницы с функцией names):

x = c("Anna", "Anna", "Hans", "Karl", "Karl", "Maria", "Sara", "Sara") 
ID = c("A", "A", "A", "A", "A", "B", "B", "B")
timestamp = c("2019-11-01", "2019-12-01", "2019-12-20", "2020-01-01", "2020-02-04", "2019-12-01", "2020-01-01", "2020-02-04")
library(data.table)
DT = data.table(timestamp, ID, x)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...