2017-02-01 2 views
3

Я очень новичок в 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.

ответ

4

Предполагая dataframe назван orders после будет делать работу:

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

Update: с помощью вложенного запроса следующее даст желаемый результат:

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 
+2

Это возвращает общую сумму, потраченную на одного пользователя в покупку, в то время как требуемая мощность кажется только максимальное количество в одной покупке из всех покупок для пользователя. Возможно, возьмите этот вывод и извлеките 'customer_id, max (сумма (сумма))' с 'group by customer_id'? – Aramis7d

+0

@ Элена Берроне, пожалуйста, примите ответ, см. [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) –

4

В случае 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 
1

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

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 на 'количество' на 'ORDER_NUMBER', петля через 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^