如何在R数据框中对每行4列日期排序并生成时序新列
R语言实现每行日期列按时间顺序排序生成新列
先构造示例数据
先模拟你描述的宽格式数据(包含缺失日期的情况):
df <- data.frame( ID = c(1, 2), date1 = as.Date(c("2021-08-17", "2020-01-01")), date2 = as.Date(c("2022-08-02", NA)), date3 = as.Date(c("2021-12-12", "2022-05-05")), date4 = as.Date(c("2022-03-15", "2021-11-11")) )
方案一:Base R 原生方法(无需额外包)
直接用apply逐行处理日期列,排序后补全缺失值到4列:
# 筛选所有日期列 date_cols <- grep("^date", names(df), value = TRUE) # 逐行排序,生成新列 df[paste0("newcol", 1:4)] <- t(apply(df[date_cols], 1, function(x) { # 按日期升序排序,缺失值放在最后 x_sorted <- sort(x, na.last = TRUE) # 强制长度为4,不足的位置用NA填充 length(x_sorted) <- 4 x_sorted }))
方案二:tidyverse 工具链(更直观的数据流)
如果你习惯用dplyr和tidyr,可以先转长格式排序,再转回宽格式:
library(tidyverse) df_sorted <- df %>% # 把日期列转成长格式 pivot_longer(cols = starts_with("date"), names_to = "old_col", values_to = "date") %>% # 按ID和日期排序 arrange(ID, date) %>% # 按ID分组,给每个日期分配排序后的列名 group_by(ID) %>% mutate(new_col = paste0("newcol", row_number())) %>% # 转回宽格式 pivot_wider(names_from = new_col, values_from = date) %>% ungroup() %>% # 和原数据合并,保留ID和其他非日期列 left_join(df, ., by = "ID")
两种方法都能实现需求:每行的日期按从早到晚的顺序,分别放入newcol1到newcol4,缺失的位置自动补NA。
内容的提问来源于stack exchange,提问作者Bob Vila
相关产品推荐
相关产品推荐

