【问题标题】:R Sequence by columns and random sequenceR 按列排序和随机序列
【发布时间】:2017-09-28 11:58:46
【问题描述】:

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

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

我很确定有一种更有效的方法可以做到这一点,但我是这种语言的新手,无法找到这个特定问题的答案。

谢谢!

【问题讨论】:

    标签: r sorting dataframe sequence sampling


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-03
      • 2019-08-24
      • 2011-06-18
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多