You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动化处理时间区间划分?按12天间隔拆分变量t并分配状态

问题描述

现有如下R语言数据框:

id <- c(1,2,3)
t <- c(13, 24, 40)
status <- c(0,1,1)
df <- data.frame(id, t, status)

输出结果为:

> df
  id  t status
1  1 13      0
2  2 24      1
3  3 40      1

需要完成以下自动化操作:

  • 将变量t按12天为间隔划分为左闭右开的时间区间
  • 为每个id生成所有前置区间的记录
  • 仅id对应的最终区间保留原始status值,其余前置区间的status设为0
  • 最终得到如下格式的结果:
id time  status
1  0-12)    0
1 [12-24)   0

2  0-12)    0
2 [12-24)  0
2 [24-36)  1

3  0-12)    0
3 [12-24)   0
3 [24-36)   0
3 [36-48)   1
解决方案

可以通过dplyr和tidyr包实现需求,代码如下:

library(dplyr)
library(tidyr)

df_result <- df %>%
  # 计算每个id需要生成的区间总数:向上取整t/12,匹配左闭右开的区间逻辑
  mutate(num_intervals = ceiling(t / 12)) %>%
  # 为每个id展开对应数量的区间行
  unnest(intervals = 1:num_intervals) %>%
  # 计算区间起止值并生成格式匹配的区间字符串
  mutate(
    start = (intervals - 1) * 12,
    end = intervals * 12,
    time = ifelse(intervals == 1, paste0(start, "-", end, ")"), paste0("[", start, "-", end, ")")),
    # 仅最后一个区间保留原始status,其余设为0
    status = ifelse(intervals == num_intervals, status, 0)
  ) %>%
  # 筛选目标列并按id和区间顺序排序
  select(id, time, status) %>%
  arrange(id, intervals)

# 输出结果(隐藏行名)
print(df_result, row.names = FALSE)

代码说明

  • ceiling(t/12):根据t值计算所需的区间总数,比如t=13时,13/12≈1.08,向上取整为2,对应2个区间
  • unnest(intervals = 1:num_intervals):为每个id生成对应区间数量的行记录
  • 区间字符串生成:第一个区间(0-12)采用0-12)格式,后续区间采用左闭的[start-end)格式,完全匹配需求格式
  • status赋值逻辑:仅当当前区间是该id的最后一个区间时,保留原始status,其余全部设为0

运行代码后得到的输出结果如下:

id   time status
  1  0-12)      0
  1 [12-24)      0
  2  0-12)      0
  2 [12-24)      0
  2 [24-36)      1
  3  0-12)      0
  3 [12-24)      0
  3 [24-36)      0
  3 [36-48)      1

内容的提问来源于stack exchange,提问作者Miguel Angel Arnau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:07:39