Выберите максимальную сумму, потраченную в одном заказе
Я очень плохо знаком с 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)