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

如何在R中切割数据框时保留所有时间区间并填充缺失值为NA

解决R语言时间区间缺失的问题

你的核心问题是原代码中没有数据的时间区间会被自动过滤,导致pivot_wider后丢失对应的列。不需要添加虚拟用户,用tidyr::complete或者连接全量区间的方法就能解决,下面是两种可行方案:

方案一:用complete补全所有区间组合

直接在分组前补全ID和day的所有可能组合,缺失数据自动填充NA:

test_data %>%
  dplyr::mutate(diff = as.double.difftime(times - min(times), units = "days")) %>%
  # 将day转为包含所有区间的因子,确保水平不丢失
  dplyr::mutate(day = cut(diff, breaks = 0:6, include.lowest = TRUE, right = TRUE, 
                         ordered_result = TRUE) %>% as.factor()) %>%
  # 强制生成ID和day的所有组合,缺失的values填NA
  tidyr::complete(ID, day) %>%
  group_by(ID, day) %>%
  filter(row_number() == n()) %>%
  select(ID, day, values) %>%
  tidyr::pivot_wider(names_from = day, values_from = values)

方案二:手动生成全量区间后右连接

先创建包含所有需要的区间的数据集,再和处理后的结果做右连接,确保所有区间都被保留:

# 生成所有目标时间区间
all_day_intervals <- dplyr::tibble(
  day = cut(0:5, breaks = 0:6, include.lowest = TRUE, right = TRUE, ordered_result = TRUE)
)

test_data %>%
  dplyr::mutate(diff = as.double.difftime(times - min(times), units = "days")) %>%
  dplyr::mutate(day = cut(diff, breaks = 0:6, include.lowest = TRUE, right = TRUE, ordered_result = TRUE)) %>%
  group_by(ID, day) %>%
  filter(row_number() == n()) %>%
  select(ID, day, values) %>%
  # 右连接全量区间,补全缺失的列
  dplyr::right_join(all_day_intervals, by = "day") %>%
  dplyr::arrange(ID, day) %>%
  tidyr::pivot_wider(names_from = day, values_from = values)

两种方案都能得到你期望的结果,其中方案一更简洁,利用complete直接补全组合,不需要额外创建区间数据集。

内容的提问来源于stack exchange,提问作者Ai4l2s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:40:19