gpt4 book ai didi

r - 日期为 'ragged' 的事件的条件滚动总和

转载 作者:行者123 更新时间:2023-12-04 12:36:52 31 4
gpt4 key购买 nike

简介

我正在使用 R 来分析非洲抗议运动的“势头”。为此,我正在分析个别抗议事件。我想创建一个滚动度量一段时间内抗议的滚动数量(总和)

Stack Overflow 上的大多数答案都处理以固定时间间隔(每天或每月一次等)观察的数据集。但是我的数据是“参差不齐的”,因为它们以不同的时间间隔出现。有时观察之间有一天。其他时候有两周。

我想创造什么

过去 10 天内某个国家/地区发生的抗议事件数量的滚动总和。这将是一个变量的形式,它简单地将过去十天内的事件数相加,包括当前事件。

数据

这是一组可重现的数据:

df1 <- data.frame(date = c("8/1/2019", "8/2/2019", "8/3/2019", "8/6/2019", "8/15/2019", "8/16/2019", "8/30/2019", "9/1/2019", "9/2/2019", "9/3/2019", "9/4/2019", "6/1/2019", "6/26/2019", "7/1/2019", "7/2/2019", "7/9/2019", "7/10/2019", "8/1/2019", "8/2/2019", "8/15/2019", "8/28/2019", "9/1/2019"),
country = c(rep("Algeria", 11), rep("Benin", 11)),
event = rep("Protest", 22))

我希望数据是什么样的

date       country   event     roll_sum
-------- ------- ------- --------
8/1/2019 Algeria Protest 1
8/2/2019 Algeria Protest 2
8/3/2019 Algeria Protest 3
8/6/2019 Algeria Protest 4
8/15/2019 Algeria Protest 2
8/16/2019 Algeria Protest 3
8/30/2019 Algeria Protest 1
9/1/2019 Algeria Protest 2
9/2/2019 Algeria Protest 3
9/3/2019 Algeria Protest 4
9/4/2019 Algeria Protest 5
6/1/2019 Benin Protest 1
6/26/2019 Benin Protest 1
7/1/2019 Benin Protest 2
7/2/2019 Benin Protest 3
7/9/2019 Benin Protest 3
7/10/2019 Benin Protest 4
8/1/2019 Benin Protest 1
8/2/2019 Benin Protest 2
8/15/2019 Benin Protest 1
8/28/2019 Benin Protest 1
9/1/2019 Benin Protest 2

这一切可能都很简单,但我不知道该怎么做。提前谢谢!

最佳答案

使用 lubridate 将日期字符串转换为 date 并使用 interval 函数创建间隔。 %within%lubridate 中的一个函数,它返回给定的日期向量是否在区间内。

创建一个 dates 列,该列的每一行是一个存储该国家/地区所有日期的列表。并使用 purrr::pmap() 迭代修改后的数据框中的所有行。

library(lubridate)
library(dplyr)
library(purrr)
df1 <- data.frame(date = c("8/1/2019", "8/2/2019", "8/3/2019", "8/6/2019", "8/15/2019", "8/16/2019", "8/30/2019", "9/1/2019", "9/2/2019", "9/3/2019", "9/4/2019", "6/1/2019", "6/26/2019", "7/1/2019", "7/2/2019", "7/9/2019", "7/10/2019", "8/1/2019", "8/2/2019", "8/15/2019", "8/28/2019", "9/1/2019"),
country = c(rep("Algeria", 11), rep("Benin", 11)),
event = rep("Protest", 22))

df2 <- df1 %>%
mutate(
date = mdy(date),
interval = interval(date -days(10),date)
) %>%
group_by(country) %>%
mutate(dates = list(date)) %>%
ungroup()

df2["roll_sum"] <- pmap_dbl(df2,function(...){
values <- list(...)
sum(values$dates %within% values$interval)
})
df2 %>%
select(-interval,-dates)
# A tibble: 22 x 4
date country event roll_sum
<date> <fct> <fct> <dbl>
1 2019-08-01 Algeria Protest 1
2 2019-08-02 Algeria Protest 2
3 2019-08-03 Algeria Protest 3
4 2019-08-06 Algeria Protest 4
5 2019-08-15 Algeria Protest 2
6 2019-08-16 Algeria Protest 3
7 2019-08-30 Algeria Protest 1
8 2019-09-01 Algeria Protest 2
9 2019-09-02 Algeria Protest 3
10 2019-09-03 Algeria Protest 4
# ... with 12 more rows

关于r - 日期为 'ragged' 的事件的条件滚动总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57861197/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com