我有一个事件的数据框架,并试图将第一个事件的非重叠120天内的所有事件分组.因此,使用以下示例数据:

library(tidyverse)

df = tibble(
  event = c(1, 2, 3, 4, 5, 6),
  date = as.Date(c("1992-01-03", "1992-09-07", "1992-11-26", "1993-01-29", "1993-02-18", "1993-04-02")),
  duration = c(4, 23, 60, 18, 30, 5)
)
df = df |>
  mutate(period_end = date + 120) 
df

# A tibble: 5 x 4
  event date       duration period_end
  <dbl> <date>        <dbl> <date>    
1     1 1992-01-03        4 1992-05-02
2     2 1992-09-07       23 1993-01-05
3     3 1992-11-26       60 1993-03-26
4     4 1993-01-29       18 1993-05-29
5     5 1993-02-18       30 1993-06-18
6     6 1993-04-02        5 1993-07-31

我需要创建的组,包括在120天内开始彼此的事件. 因此,在本例中,我将拥有事件A:[1]、B:[2,3]和C:[4,5,6]的组. 所以B组从1992-9-7开始,1993-1-5结束,事件4不在这个窗口内,即使它在事件3的2个月内开始,但它超过了组的结束日期.C组将从事件4开始,一直持续到"1993-5-29"

我可以用date < lag(period_end)来测试每个事件是否在前一个事件的窗口内,但这会测试每个事件与之前的时间段.我如何创建基于组中第一个事件的组,以便更远地查看关闭的组?

推荐答案

如果你想把这个问题当做基本编程技能的练习,你可以试试100,循环如下

v <- date + 120
grp <- rep(0, length(date))
id <- 1
i <- 1
repeat {
    if (i == length(grp)) break
    for (j in i:length(date)) {
        if (date[j] <= v[i]) {
            grp[j] <- id
        } else {
            id <- id + 1
            break
        }
    }
    i <- j
}

并且您将拥有分组信息grp

> grp
[1] 1 2 2 3 3 3

Data

date <- as.Date(c("1992-01-03", "1992-09-07", "1992-11-26", "1993-01-29", "1993-02-18", "1993-04-02"))

R相关问答推荐

给定R中另一行中的值,如何插补缺失值

R中的枢轴/转置

更改编号列表的 colored颜色

使用R中相同值创建分组观测指标

如何使用按钮切换轨迹?

如何在格子中添加双曲曲线

根据文本字符串中的值粘贴新列

如何在所有绘图中保持条件值的 colored颜色 相同?

R中的时间序列(Ts)函数计数不正确

R Select()可以测试不存在的子集列

将一个字符串向量调整为与其他字符串向量完全相同的大小

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

R中Gamma回归模型均方误差的两种计算方法不一致

使用R将简单的JSON解析为嵌套框架

是什么打破了此Quarto仪表板中的工具提示?

希望解析和复制R中特定模式的数据

随机生成样本,同时在R内的随机样本中至少包含一次所有值

具有由向量定义的可变步长的序列

在使用ggplot2的情况下,如何在使用coord_trans函数的同时,根据未转换的坐标比来定位geom_瓷砖?

如何根据每个子框架中分类因子的唯一计数来过滤子框架列表?