【问题标题】:Averages for each row in my dataframe by a condition and put on a new dataframe按条件计算数据框中每一行的平均值并放入新数据框
【发布时间】:2018-07-07 05:12:51
【问题描述】:

我有以下数据框:

    I  UserID | Day_of_week | hour | min | sms
   #1    1           1          0     0      12
   #2    1           1          0     30     20
   #3    1           1          1     0      19
   #4    1           1          1     30     11
   #5    1           1          2     0      12
   #6    1           1          2     30     7
   ...   ...         ...       ...    ...   ....
   #10    1          2          0     0      142
   #11    1          2          0     30     201
   #12    1          2          1     0      129
   #13    1          2          1     30     111
   ...   ...         ...       ...    ...   ....

Day_of_week 列从 0 变为 6,其中

  • (1 = 星期一,2 = 星期二 .... 5 = 星期五)
  • 0、6 分别是周六和周日。

列小时范围从 0 到 23。

我想创建相同的日期框架,在其中添加了一周中的几天(周一到周五)和周末(周六和周日)以及它们各自每小时和每分钟的平均值。

我想要这样的东西:所有(周一、周二、...周五)在 0 小时 0 分钟的平均值是 12.1。

x- 代表星期几

y- 代表周末

    I  UserID | Day_of_week | hour | min | sms
   #1    1           x          0     0      12.1
   #2    1           x          0     30     19.1
   #3    1           x          1     0      14
   #4    1           x          1     30     11
   ...   ...         ...       ...    ...   ....
   #10    1          y          0     0      1123
   #11    1          y          0     30     23
   #12    1          y          1     0      45
   #13    1          y          1     30     121
   ...   ...         ...       ...    ...   ....

【问题讨论】:

    标签: r dataframe average


    【解决方案1】:

    样本数据:

    # Read and expand the dataset with some weekend days
    df = read.table(text='I  UserID  Day_of_week  hour  min  velocity
    1    1           1          0     0      12
    2    1           1          0     30     20
    3    1           1          1     0      19
    4    1           1          1     30     11
    5    1           1          2     0      12
    6    1           1          2     30     7
    10    1          2          0     0      142
    11    1          2          0     30     201
    12    1          2          1     0      129
    13    1          2          1     30     111',header=T)
    df2 = df %>% mutate(Day_of_week=7)
    df = rbind(df,df2)
    

    您可以使用dplyr 并执行以下操作:

    library(dplyr)
    df %>% mutate(daytype = ifelse(Day_of_week %in% seq(1,5),'weekday','weekend')) %>%
      group_by(UserID,daytype,hour,min) %>% 
      summarize(velocity=mean(velocity))
    

    替代data.table:

    library(data.table)
    setDT(df)[,daytype := ifelse(Day_of_week %in% seq(1,5),'weekday','weekend')][,.(velocity=mean(velocity)),.(UserID,daytype,hour,min)]
    

    或使用基础 R:

    df$daytype = ifelse(df$Day_of_week %in% seq(1,5),'weekday','weekend')
    aggregate(velocity~UserID+daytype+hour+min,df,FUN='mean')
    

    输出:

        UserID daytype hour min velocity
     1:      1 weekday    0   0     77.0
     2:      1 weekday    0  30    110.5
     3:      1 weekday    1   0     74.0
     4:      1 weekday    1  30     61.0
     5:      1 weekday    2   0     12.0
     6:      1 weekday    2  30      7.0
     7:      1 weekend    0   0     77.0
     8:      1 weekend    0  30    110.5
     9:      1 weekend    1   0     74.0
    10:      1 weekend    1  30     61.0
    11:      1 weekend    2   0     12.0
    12:      1 weekend    2  30      7.0
    

    【讨论】:

    • 哈哈,这个很直接。您可以添加一个data.table 解决方案并超越我的;)
    • 不...您应该将其添加到您的答案中... Base R 也是 IMO。午餐也准备好了:)
    • @user147460,您的消息似乎比预期的要短一些?
    • 嘿 Florian 我还有一个问题,如何更改 Day_of_week 列中的值(1 = 星期一,2 = 星期二 .... 5 = 星期五....0=星期六,6=星期日)按名字?
    • @user147460,您可以创建一个包含数字和工作日之间链接的data.frame,然后使用匹配。如果您仍然需要一些指导,请考虑将此作为 Stack Overflow 上的新问题。
    猜你喜欢
    • 2015-08-02
    • 2022-01-11
    • 2015-09-10
    • 2020-04-02
    • 2017-12-04
    • 2018-09-06
    • 1970-01-01
    • 2019-07-18
    • 2020-12-04
    相关资源
    最近更新 更多