Топ n во вложенной группировке с использованием data.table - PullRequest
2 голосов
/ 07 февраля 2020

Цель : сгруппированы по кварталам и именам. Я хочу, чтобы количество первых имен было по количеству (см. Пример ниже). Таким образом, желаемый результат для top 1 (для приведенного ниже примера) будет:

2019 Q1  Klaus 2
2019 Q2   Karl 3

Поскольку это всего лишь игрушечный пример в будущем, я также хочу получить top 4, 5 et c by count за квартал и название. У вас есть какие-нибудь хорошие идеи, как реализовать это с data.table (пожалуйста, не dplyr). Большое спасибо!

library(data.table)

dt <- data.table(x = c("2019 Q1", "2019 Q1", "2019 Q1", "2019 Q2", "2019 Q2", "2019 Q2", "2019 Q2"),
                 y = c("Klaus", "Gustav", "Klaus", "Karl", "Karl", "Karl", "Stefan"))

# Structure of dt
# x      y
# 1: 2019 Q1  Klaus
# 2: 2019 Q1 Gustav
# 3: 2019 Q1  Klaus
# 4: 2019 Q2   Karl
# 5: 2019 Q2   Karl
# 6: 2019 Q2   Karl
# 7: 2019 Q2 Stefan


dt[, .N, by = .(x, y)]

# Output:
# x      y N
# 1: 2019 Q1  Klaus 2
# 2: 2019 Q1 Gustav 1
# 3: 2019 Q2   Karl 3
# 4: 2019 Q2 Stefan 1

Ответы [ 4 ]

5 голосов
/ 07 февраля 2020

Вы можете сначала вычислить N на имя и квартал, а затем упорядочить таблицу data.table, а затем выбрать первые n строк на квартал:

dt[, .N, by = .(x, y)][order(-N), head(.SD, 1), by = x]
1 голос
/ 07 февраля 2020

вот еще один data.table подход, почти такой же, как ответ Джилиан, но без head().

dt[, .N, by = .(x,y) ][ order(-N), .SD[1:1], by = x ]

#          x     y N
# 1: 2019 Q2  Karl 3
# 2: 2019 Q1 Klaus 2
1 голос
/ 07 февраля 2020

Вот базовое решение R с использованием aggregate

> aggregate(y~x,dt,function(v) as.matrix(head(data.frame(sort(table(v),decreasing = TRUE)),1)))
        x   y.1 y.2
1 2019 Q1 Klaus   2
2 2019 Q2  Karl   3
0 голосов
/ 07 февраля 2020

Другое решение с data.table:

dt[, .N, by = .(x, y)][, .SD[N==max(N)][1], x]

или лучше

dt[, .N, by = .(x, y)][, head(.SD[N==max(N)], 1), x]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...