【问题标题】:How to group by every 7 rows, and aggregate those 7 values by median?如何按每 7 行分组,并按中位数聚合这 7 个值?
【发布时间】:2015-08-18 17:07:10
【问题描述】:

我有一个这样的每日收入数据框:

         date    earning
            1 -40.495074
            2 -88.636625
            3 134.400976
            4  66.325253
            5 -86.337511
            6  -1.266815
            7 267.944212
            8  65.247053
            9  86.177537
           10  64.540579        

我想每 7 天分组一次,并使用中位数汇总 7 天的收入。

edit1:不必是日历周,只需任意 7 天作为组。

原来是这样的

week  median-earning
   1  11
   2  22

等等……

如何在 R 中实现这一点?

【问题讨论】:

  • 在您的日期列中,您使用的是实际日期还是整数?
  • 这是实际日期。如 2014-9-13,将其转换为整数会更容易吗?
  • 同样重要的是要知道,当您说每 7 天时,您指的是日历周吗?还是您想从任意一天开始?
  • 当然。不必是日历周,只需从数据框的任意日期开始每 7 天。

标签: r


【解决方案1】:
library(dplyr)
theData <- data.frame(date = 1:10,
                      earning = c(-40, -88, -134, 66, -86, -1, 267, 65, 86, 64))

theData$seven_day_index <- c(0, rep(1:(nrow(theData)-1)%/%7))

group_by(theData, seven_day_index) %>%
  summarise(median_earnings = median(earning))

和基础 R 版本

sapply(split(theData$earning, c(0, rep(1:(nrow(theData)-1)%/%7))), median)

编辑:受上述启发

theData %>% mutate(seven_day_index = 1:nrow(theData) %/% 7) %>%
            group_by(seven_day_index) %>%
            summarise(median_earnings = median(earning)

【讨论】:

  • 感谢@nongkrong 以巧妙的方式获得seven_day_index
  • 已编辑。仍然比我通常处理这些事情的方式要酷得多。
  • 谢谢本杰明和nongkrong
  • 您也可以创建一个“星期列”,而不是使用“七日索引”:mutate(week = format(.$date, "%Y/%W"))。 nongkrong 的方式 很圆滑。
猜你喜欢
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多