Выберите максимальную сумму, потраченную в одном заказе

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

Файл выглядит так:

customer_id,order_number,order_date, amount, product_name
1, 202, 21/04/2015, 58, "xlfd"
1, 275, 16//08/2015, 74, "ghb"
1, 275, 16//08/2015, 36, "fjk"
2, 987, 12/03/2015, 27, "xlgm"
3, 376, 16/05/2015, 98, "fgt"
3, 368, 30/07/2015, 46, "ade"

Мне нужно найти максимальную сумму, потраченную за одну транзакцию order_number) каждым customer_id, Например, в случае customer_id "1" это было бы (74+36)=110,

3 ответа

В случае sqldf не является строгим требованием.

Учитывая ваш вклад как dft, ты можешь попробовать:

require(dplyr)
require(magrittr)
dft %>% 
    group_by(customer_id, order_number) %>% 
    summarise(amt = sum(amount)) %>% 
    group_by(customer_id) %>% 
    summarise(max_amt = max(amt))

который дает:

Source: local data frame [3 x 2]
Groups: customer_id [3]

  customer_id max_amt
        <int>   <int>
1           1     110
2           2      27
3           3      98

Предполагая, что датафрейм назван orders, следующие сделают работу:

sqldf("select customer_id, order_number, sum(amount) 
       from orders 
       group by customer_id, order_number")

Обновление: используя вложенный запрос, следующий результат даст желаемый результат:

sqldf("select customer_id, max(total) 
       from (select customer_id, order_number, sum(amount) as total 
             from orders 
             group by customer_id, order_number) 
       group by customer_id")

Выход:

    customer_id max(total)
1           1        110
2           2         27
3           3         98

Мы также можем использовать data.table, Преобразовать data.frame в data.tablesetDT(df1)), сгруппированные по 'customer_id', 'order_number', мы получаем sum "количество", сделайте вторую группу с помощью "customer_id" и получите max "Суммаунт"

library(data.table)
setDT(df1)[, .(Sumamount = sum(amount)) , .(customer_id, order_number)
        ][,.(MaxAmount = max(Sumamount)) , customer_id]
#   customer_id MaxAmount
#1:           1       110
#2:           2        27
#3:           3        98

Или сделав его более компактным, после группировки по customer_id мы split "сумма" по "порядковый номер", цикл через list, получить sum, Найти max чтобы получить "MaxAmount"

setDT(df1)[, .(MaxAmount = max(unlist(lapply(split(amount,
                      order_number), sum)))), customer_id]
#   customer_id MaxAmount
#1:           1       110
#2:           2        27
#3:           3        98

Или используя base R

aggregate(amount~customer_id, aggregate(amount~customer_id+order_number, 
                         df1, sum), FUN = max)
Другие вопросы по тегам