假设我有一个客户数据框 -
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
我想做两个不同的动作: 1.检查每天的第一批客户花费多少时间和金钱 2.将其与每天的随机3位客户进行比较(它们可以在前三位或不在前三位) 如果当天的客户少于3位,我希望从那天起包括所有客户。
最有效的方法是什么?
目前我的代码是:
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
}
对于随机部分:
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])),])
我非常确定有一种更有效的方式,但我对这种语言不熟悉并且无法找到这个具体问题的答案。
谢谢!
答案 0 :(得分:3)
The dplyr
package可以为您提供帮助。
install.packages("dplyr")
library(dplyr)
要获得前一天的前3位客户group_by
日期,然后slice
:
cust_df %>%
group_by(Date) %>%
slice(1:3)
从您的问题中不清楚如何总结时间和消费,但您可以总结一下,例如,像这样:
cust_df %>%
group_by(Date) %>%
slice(1:3) %>%
summarise(sumSpent = sum(AmountSpent))
Date sumSpent
<int> <int>
1 170920 140
2 170921 325
您可以使用sample_n
cust_df %>%
group_by(Date) %>%
sample_n(3) %>%
summarise(sumSpent = sum(AmountSpent))
Date sumSpent
<int> <int>
1 170920 130
2 170921 325