如何解决每七天后求和但在 R 中缺少天数
我有一个 R df 如下:
| date_entered | returning | new |
| ------------ | --------- | --- |
| 2021-06-02 | 0 | 14 |
| 2021-06-03 | 12 | 8 |
| 2021-06-04 | 8 | 0 |
| 2021-06-05 | 7 | 15 |
| 2021-06-07 | 10 | 4 |
| 2021-06-08 | 12 | 22 |
| 2021-06-09 | 4 | 15 |
| 2021-06-10 | 0 | 28 |
| 2021-06-12 | 22 | 16 |
| 2021-06-15 | 20 | 5 |
| 2021-06-16 | 18 | 12 |
| 2021-06-17 | 2 | 10 |
| 2021-06-18 | 12 | 8 |
- 请注意,缺少日期。我需要在每七天之后从上面找到“新”列的总和,如下所示:
| date_range | sum_new |
| ----------------------- | ------- |
| 2021-06-02 - 2021-06-08 | 53 |
| 2021-06-09 - 2021-06-15 | 49 |
| 2021-06-16 - 2021-06-22 | 30 |
我尝试了以下方法:
library(zoo)
n <- 7
rollapply(df$new,n,sum,by = n)
但它忽略日期,只是在 df 的每七个值之后添加
| sum_new |
| ------- |
| 78 |
| 79 |
这不是我想要的。
解决方法
您可以使用 cut
将数据集划分为 7 天间隔和 sum
new
值。
library(dplyr)
df %>%
group_by(group = cut(date_entered,'7 days')) %>%
summarise(date_range = paste(min(date_entered),min(date_entered) + 6,sep = '-'),sum_new = sum(new)) %>%
select(-group)
# date_range sum_new
# <chr> <int>
#1 2021-06-02-2021-06-08 63
#2 2021-06-09-2021-06-15 64
#3 2021-06-16-2021-06-22 30
,
我们假设输入在最后的注释中可重复显示。
删除返回列,转换为zoo,这也将字符日期转换为Date类,然后将其转换为ts。转换为 ts 将插入缺失的日期,为这些提供新的 NA 值。然后将其转换回动物园并用 0 填充 NA。接下来使用 rollapply。我们向左对齐并使用 partial=TRUE 以便包括结束时的部分周。出现的日期将是每 7 天间隔的开始。因为 ts 不能表示 Date 类,所以时间将是数字,所以使用聚合将它们转换回 Date,将总和作为动物园对象 sum_new。可选择将其转换为数据框(或省略它并仅使用 sum_new)。
library(zoo)
sum_new <- df |>
subset(select = -returning) |>
read.zoo() |>
as.ts() |>
as.zoo() |>
na.fill(0) |>
rollapply(7,by = 7,sum,partial = TRUE,align = "left") |>
aggregate(as.Date)
fortify.zoo(sum_new,name = "date")
给予:
date sum_new
1 2021-06-02 63
2 2021-06-09 64
3 2021-06-16 30
注意
df <-
structure(list(date_entered = c("2021-06-02","2021-06-03","2021-06-04","2021-06-05","2021-06-07","2021-06-08","2021-06-09","2021-06-10","2021-06-12","2021-06-15","2021-06-16","2021-06-17","2021-06-18"
),returning = c(0L,12L,8L,7L,10L,4L,0L,22L,20L,18L,2L,12L),new = c(14L,15L,28L,16L,5L,8L)),class = "data.frame",row.names = c(NA,-13L
,
我的解决方案是按您的范围对 date_entered
进行分组,然后通过
求和
每组。
dt %>%
group_by(dr = findInterval(date_entered,as.Date(c("2021-06-09","2021-06-16")))) %>%
summarise(sum_new = sum(new))
或者用data.table
dt <- fread("
date_entered returning new
2021-06-02 0 14
2021-06-03 12 8
2021-06-04 8 0
2021-06-05 7 15
2021-06-07 10 4
2021-06-08 12 22
2021-06-09 4 15
2021-06-10 0 28
2021-06-12 22 16
2021-06-15 20 5
2021-06-16 18 12
2021-06-17 2 10
2021-06-18 12 8 ")
dt[,.(sum_new = sum(new)),by = .(dr = findInterval(date_entered,"2021-06-16"))))]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。