如何在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
相关产品推荐
相关产品推荐

