You need to enable JavaScript to run this app. R中按日期批量更新夜间时段二进制value列的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

R中按日期批量更新夜间时段二进制value列的实现方法

R 按日期批量更新夜间时段二进制value的实现方法

原始需求梳理

现有数据集共4列字段,结构如下:

  • date:观测所属日期
  • hour:观测对应的当日小时数
  • period:时段标识,取值为夜间/昼间
  • value:二进制观测值,仅包含0、1两种取值
    已明确的时段划分规则:22:00-05:00为夜间(睡眠时段),06:00-21:00为昼间
    需执行的批量处理逻辑:
  1. 按单个日期维度拆分所有观测行
  2. 对每个日期下的全部夜间时段行做判断:只要任意一行的value取值为1,就将该日期下所有夜间小时的value统一修改为1
  3. 若该日期下所有夜间小时的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 15:24:01