Подсчитайте категориальные уровни с разбивкой на столбцы агрегированной таблицы - PullRequest
0 голосов
/ 28 мая 2020

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

Вот мои данные:

library(data.table)
DT <- data.table(x = c(1, 1, 2, 1, 1, 1, 3, 3, 3, 2, 2), 
                 y = c("A", "A", "B", "A", "A", "B", "B", "B", "A", "C"))
> DT
    x y
 1: 1 A
 2: 1 A
 3: 2 B
 4: 1 A
 5: 1 A
 6: 1 B
 7: 3 B
 8: 3 B
 9: 3 A
10: 2 A
11: 2 C

Теперь я хочу агрегировать DT по x и получить data.table со столбцами, названными после каждой категории, найденной в y, с отображением соответствующей частоты:

   x A B C
1: 1 4 1 NA
2: 2 1 1 1
3: 3 1 2 NA

До сих пор мне удавалось решить эту проблему только «вручную», создавая агрегаты для каждой категории, например, DT[y == "A", .N, by = x], и объединяя их вместе с помощью левого соединения. Я безуспешно обработал весь inte rnet для гораздо более динамичного c решения, такого как функция, которая просто обеспечивает желаемый результат, например:

DT1 <- aggfunc(DT, var = "y", by = "x")

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Конечно, есть. В основном вы хотите изменить свои счетчики:

# count cases
aggregated <- DT[, .N, by = .(y, x)]
# reshape to desired result
dcast(aggregated, formula = x ~ y, value.var = "N")
   x A B  C
1: 1 4 1 NA
2: 2 1 1  1
3: 3 1 2 NA

или, чтобы напрямую написать желаемую функцию:

aggfunc <- function(DT, var = "y", by = "x"){
  DT[, .N, by = c(var, by)]
  dcast(aggregated, formula = paste(by, "~", var), value.var = "N")
}

aggfunc(DT)
   x A B  C
1: 1 4 1 NA
2: 2 1 1  1
3: 3 1 2 NA
0 голосов
/ 28 мая 2020

Другая возможность использования summarise и pivot_wider:

DT %>%
  group_by(x,y) %>%
  summarise(num = n()) %>%
  pivot_wider(names_from=y, values_from=num) %>% 
  as.data.table

дает нам

   x A B  C
1: 1 4 1 NA
2: 2 1 1  1
3: 3 1 2 NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...