2017-09-28 4 views
1

Dire que j'ai une trame de données de clients -R Séquence par des colonnes et la séquence aléatoire

cust_df = 
Date  ArrivalTime TimeInStore  AmountSpent 
170920  930    30    20 
170920  1000   20    20 
170920  1001   30    100 
170920  1500   15    10 
170921  1030   10    200 
170921  1111   25    50 
170921  1900   10    75 

Je veux faire 2 actions différentes: 1. Vérifiez combien de temps et d'argent les 3 premiers clients de chaque jour dépenser 2. Comparez cela au hasard 3 clients de chaque jour (ils peuvent être dans les trois premiers ou pas) Si au cours de cette journée, il y avait moins de 3 clients, je veux inclure tous les clients de ce jour.

Quel est le moyen le plus efficace de le faire?

Actuellement mon code est:

cust_df <- cust_df[order(cust_df$Date, cust_df$ArrivalTime),] #order by time 
cust_df_by_Date <- split(cust_df,f = cust_df$Date) #split to dates 
cust_num <- sapply(cust_df_by_Date,function(x) dim(x)[1]) #find num of customers per day 
first_cust_df <- c() 
i <- 1 
for(num in cust_num){ 
    if(num>=3){ 
     first_cust_df <- rbind(first_cust_df,cust_df_by_Date[[i]][1:3,]) 
    } 
    else{ 
     first_cust_df <- rbind(first_cust_df,cust_df_by_Date[[i]][1:num,]) 
    } 
    i <- i+1 
} 

Et pour la partie aléatoire:

rand_cust_sampling_df <- ldply(cust_df_by_Date,function(x) x[sample(1:dim(x)[1],ifelse(dim(x)[1]>=3,3,dim(x)[1])),]) 

Je suis tout à fait sûr qu'il ya une façon de faire plus efficace, mais je suis nouveau à cette langue et n'a pas pu trouver une réponse à cette question spécifique.

Merci!

Répondre

3

The dplyr package peut vous aider.

install.packages("dplyr") 
library(dplyr) 

Pour obtenir les 3 premiers clients un jour, group_by Date de puis slice:

cust_df %>% 
    group_by(Date) %>% 
    slice(1:3) 

Pas clair de votre question comment vous voulez résumer le temps et les dépenses, mais vous pourriez résumer, par exemple, comme ceci:

cust_df %>% 
    group_by(Date) %>% 
    slice(1:3) %>% 
    summarise(sumSpent = sum(AmountSpent)) 

    Date sumSpent 
    <int> <int> 
1 170920  140 
2 170921  325 

Vous pouvez sélectionner au hasard 3 clients par jour à l'aide sample_n:

cust_df %>% 
    group_by(Date) %>% 
    sample_n(3) %>% 
    summarise(sumSpent = sum(AmountSpent)) 

    Date sumSpent 
    <int> <int> 
1 170920  130 
2 170921  325