Предположим, что я хочу найти для каждой категории покупок 3 наиболее часто встречающихся почтовых индекса. В этом примере категории home, таунхаус и кондо. У меня есть данные о транзакциях, как:data.table получить N наиболее часто используемых значений по группе
set.seed(1234)
d <- data.table(purch_id = 1:3e6,
purch_cat = sample(x = c('home','townhouse','condo'),
size = 3e6, replace=TRUE),
purch_zip = formatC(sample(x = 1e4:9e4, size = 3e6, replace=TRUE),
width = 5, format = "d", flag = "0"))
Я знаю, что я могу это сделать:
# there has to be a better way...
d[,list(purch_count = length(purch_id)),
by=list(purch_cat, purch_zip)][, purch_rank := rank(-purch_count, ties.method='min'),
by=purch_cat][purch_rank<=3,][order(purch_cat, purch_rank)]
purch_cat purch_zip purch_count purch_rank
1: condo 39169 32 1
2: condo 15725 31 2
3: condo 75768 30 3
4: condo 72023 30 3
5: home 71294 30 1
6: home 56053 30 1
7: home 57971 29 3
8: home 77521 29 3
9: home 70124 29 3
10: home 25302 29 3
11: home 65292 29 3
12: home 39488 29 3
13: townhouse 39587 33 1
14: townhouse 80365 30 2
15: townhouse 37360 30 2
Но это не может быть самый элегантный data.table
подход, и, кажется, своего рода медленно.
Любые предложения по сокращению количества проходов? Может быть, что-то использует table()
? TYVM!
@Frank, который кажется правильным на самом деле, для использования в реальном мире ... если есть связи – MichaelChirico
@Frank это просто логическая связь, но это не так уж и важно. Я просто хотел purchase_rank <= 3, чтобы получить по крайней мере три результата. Я мог бы получить пять застежек, привязанных для первого (а затем следующего - шестого) и т. Д. Я открыт для различных правил привязки к галстукам. – C8H10N4O2
@ C8H10N4O2 фактически, см. Редактирование. ваш ответ был в основном правильным. – MichaelChirico