Количество раз превышение значения в одном df во втором df в зависимости от других условий - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть история транзакций в кадре данных.Каждая транзакция имеет три атрибута: год, размер и цвет.

Transactions <- data.frame(Size=c("S","S","S","S","L","L","S","L"),                     
                       Color=c("R","R","R","B","R","B","B","R"),
                       Year=c(1,1,2,1,1,1,2,2))
 Size Color Year  
 S     R     1   
 S     R     1   
 S     R     2   
 S     B     1   
 L     R     1   
 L     B     1   
 S     B     2   
 L     R     2   

Итак, первая, вторая и третья транзакции: SR1, SR1 и SR2.Это три SR транзакции.Два в 1-м году и один в 2-м.

Я хотел бы получить отчет в форме df, который суммирует для каждой комбинации цвета и размера число совпадений или превышений года.Таким образом, для данных выше правильный окончательный отчет показан ниже.

Size Color Year Count 
 S     R     1   3 (from obs 1,2,3 because there are 3 SRs Yr 1 or later)
 S     R     2   1 (from row 3 of transaction b/c just one SR2)
 S     B     1   2
 S     B     2   1
 L     R     1   2
 L     R     2   1
 L     B     1   1
 L     B     2   0 (Because  LB2  doesn't appear in transactions.

Последовательность строк в отчете не берется из фрейма транзакции.Это полная перестановка всех уровней размера, цвета и года.В моей настоящей проблеме у меня есть df со структурой первых трех столбцов в отчете, поэтому я хотел бы иметь возможность просто добавить к нему последний столбец.Этот df без последнего col будет выглядеть так:

Report <- data.frame(Size= c("S","S","S","S","L","L","L","L"),
                 Color=c("R","R","B","B","R","R","B","B"),
                 Year= c(1,2,1,2,1,2,1,2)
                 )

Я бы хотел добавить последний col, но если есть способ сгенерировать его непосредственно из транзакций, это тоже хорошо.Но так как возможно, что некоторые комбинации отчетов не появляются в транзакциях, я не думаю, что это осуществимо.

1 Ответ

0 голосов
/ 25 апреля 2018

Вот решение с data.table:

Transactions <- data.frame(Size=c("S","S","S","S","L","L","S","L"),                     
                           Color=c("R","R","R","B","R","B","B","R"),
                           Year=c(1,1,2,1,1,1,2,2))
library("data.table")
setDT(Transactions)
allYears <- Transactions[, unique(Year)]
Transactions[, .(Year=allYears, count=sapply(allYears, function(y) sum(Year>=y))), by=.(Size, Color)]
# > Transactions[, .(Year=allYears, count=sapply(allYears, function(y) sum(Year>=y))), by=.(Size, Color)]
#    Size Color Year count
# 1:    S     R    1     3
# 2:    S     R    2     1
# 3:    S     B    1     2
# 4:    S     B    2     1
# 5:    L     R    1     2
# 6:    L     R    2     1
# 7:    L     B    1     1
# 8:    L     B    2     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...