如何自动化处理时间区间划分?按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
相关产品推荐
相关产品推荐

