Как отсортировать и предоставить 5 лучших значений для каждого месяца в R - PullRequest
0 голосов
/ 18 января 2019

Я создал фрейм данных, который имеет три столбца Имя, Месяц и Сумма. Формат таков, что в каждом месяце есть несколько имен, и каждая комбинация имеет сумму. Я хочу найти 5 лучших пользователей, основываясь на их ежемесячных расходах. Это означает, что окончательные данные во фрейме данных будут иметь только 5 лучших доходов за каждый месяц. То, как я сейчас вычислил данные, теперь **

Extract_Month<- months(Credit$Transaction.Date)
Extract_Month
TopSpend<-aggregate(Credit$Amount, 
                    by=list(Credit$User,Extract_Month)
                    , FUN=mean)

** Я застрял за этой точкой. Пожалуйста, помогите

Вот некоторые примеры данных

User<-c(6,2,3,4,5,6)
Transaction.Date<-c("11-1-2019","11-2-2019","11-3-2019",
"12-1-2019","12-2-2019","11-1-2019")
Amount<-c(100,200,300,400,500,150)

Credit<-data.frame(User,Transaction.Date,Amount)

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Использование вымышленных данных за несколько месяцев. Возможно, не самый лучший подход, но он работает. Я бы порекомендовал работать с @NelsonGon на подходе Tidyverse.

Создание данных:

library(dplyr)

User<-c(6,2,3,4,5,6)
Transaction.Date<-c("11-1-2019","11-2-2019","11-3-2019",
"12-1-2019","12-2-2019","11-1-2019")
Amount<-c(100,200,300,400,500,150)

Credit<-data.frame(User,Transaction.Date,Amount)

Совокупность, организация и подмножество:

#Aggregate user by avg amount spent and date
TopSpend<-aggregate(Credit$Amount, 
                by=list(Credit$User,Credit$Transaction.Date)
                , FUN=mean)

#Reverse so high in the start                    
TopSpend<-arrange(TopSpend, rev(rownames(TopSpend)))
                    print(TopSpend)

#Rename for clarity                
names(TopSpend)<-c("User", "Date","Amount")

#Format date for split              
TopSpend$Date<-as.POSIXct(TopSpend$Date, format="%m-%d-%Y")

#Split based on month             
TopSpend_Fin<-split(TopSpend, format(TopSpend$Date, "%Y-%m"))

#Get first 5 elements (non-existent won't throw error)
TopSpend_Fin<-lapply(TopSpend_Fin, head, n = 5L)

$`2019-11`
  User       Date Amount
3    3 2019-11-03    300
4    2 2019-11-02    200
5    6 2019-11-01    125

$`2019-12`
  User       Date Amount
1    5 2019-12-02    500
2    4 2019-12-01    400
0 голосов
/ 18 января 2019

Вот решение:

 library(tidyverse)
 df<-data.frame(Name=c("A","B","C"),Month=as.factor(c(11,11,11)),Amount=c(123,456,789))
 df %>% 
 arrange(desc(Amount)) %>% 
 top_n(2,Amount)#change 2 to 5

Лучше всего предоставить пример данных:

iris %>% 
  group_by(Species) %>% 
  arrange(desc(Sepal.Length)) %>% 
  top_n(5,Sepal.Length)

ИЛИ :: На основании данных @Chabo:

User<-c(6,2,3,4,5,6)
Transaction.Date<-c("11-1-2019","11-2-2019","11-3-2019",
                    "12-1-2019","12-2-2019","11-1-2019")
Amount<-c(100,200,300,400,500,150)
df1<-data.frame(Amount,Transaction.Date,User)
df1 %>% 
  group_by(User,Transaction.Date) %>% 
  arrange(desc(Amount)) %>% 
  top_n(5,Amount) %>% 
  ungroup() %>% 
  top_n(5,Amount)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...