R中按日期批量更新夜间时段二进制value列的实现方法
R 按日期批量更新夜间时段二进制value的实现方法
原始需求梳理
现有数据集共4列字段,结构如下:
date:观测所属日期hour:观测对应的当日小时数period:时段标识,取值为夜间/昼间value:二进制观测值,仅包含0、1两种取值
已明确的时段划分规则:22:00-05:00为夜间(睡眠时段),06:00-21:00为昼间
需执行的批量处理逻辑:
- 按单个日期维度拆分所有观测行
- 对每个日期下的全部夜间时段行做判断:只要任意一行的
value取值为1,就将该日期下所有夜间小时的value统一修改为1 - 若该日期下所有夜间小时的
value均为0,则保留原有取值不做修改
此前尝试使用
na.locf、replace函数未实现目标的核心原因:逐行前值填充的逻辑无法完成同组全量扫描判断后,再批量回写赋值的操作。
完整可复现代码
使用dplyr实现分组判断+批量赋值,无需逐行循环操作:
# 加载依赖包 library(dplyr) # 对原始数据集执行处理 processed_result <- raw_df %>% # 按日期分组,匹配每个日期下的全量行 group_by(date) %>% mutate( # 仅修改夜间时段的value值 value = ifelse( period == "夜间", # 计算当前日期下所有夜间行的value最大值 max(value[period == "夜间"]), # 昼间行保留原有value值不改动 value ) ) %>% # 解除分组,得到最终数据框 ungroup()
关键说明
- 因为value仅为0/1,组内取最大值的计算结果和需求判定逻辑完全等价:只要夜间组内出现过1,最大值就为1,全为0时最大值也为0,不会出现误判
- 若存在跨天夜间时段(例如1日22:00至2日5:00归属1日的夜间观测),可在分组前先对跨天的行做日期归属修正,避免夜间行被拆分到不同日期组导致判断错误
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

