R按列和随机序列

时间:2017-09-28 11:58:46

标签: r sorting dataframe sequence sampling

假设我有一个客户数据框 -

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])),])

我非常确定有一种更有效的方式,但我对这种语言不熟悉并且无法找到这个具体问题的答案。

谢谢!

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

按日期随机选择3位客户
cust_df %>% 
  group_by(Date) %>% 
  sample_n(3) %>% 
  summarise(sumSpent = sum(AmountSpent))

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