在R语言中补全序列缺失日期并保留行内其他字段值的方法
补全分组内缺失日期并保留其他列值的解决方案
首先,先还原你的数据集:
ID <- c("A1","A1","A1","A1","A1","B1","B1","B1","B1") Age <- c(0,1,2,3,4,0,1,2,3) Date <- c("2006-05-03",NA,"2006-05-05",NA,"2006-05-07","2006-06-02",NA,"2006-06-04","2006-06-05") Value1 <- c(6,6,6,6,6,4,4,4,4) df <- data.frame(ID, Age, Date, Value1)
你遇到的问题是:用complete补全日期时,其他列被覆盖成NA,这是因为你用了全局的日期范围,而且没有把补全的日期和每个ID的Age关联起来。其实你的需求里有个关键信息——Age是天数,而且每个ID的Age是连续完整的序列,这刚好可以用来精准推算缺失的日期。
下面是完美解决这个问题的代码:
library(dplyr) library(tidyr) df_filled <- df %>% group_by(ID) %>% # 先把Date转为日期格式,方便后续计算 mutate(Date = as.Date(Date)) %>% # 确保每个ID的Age序列是完整连续的(不会漏掉任何Age值) complete(Age = full_seq(Age, 1)) %>% # 利用Age是天数的特性,推算每个Age对应的Date mutate( # 获取每个ID的起始日期(也就是Age=0对应的非NA日期) start_date = first(Date[!is.na(Date)]), # 起始日期加上Age天数,就是当前Age对应的准确日期 Date = start_date + Age ) %>% # 填充Value1列——因为每个ID的Value1是固定值,上下填充即可 fill(Value1, .direction = "downup") %>% ungroup()
运行这段代码后,你会得到补全后的数据集:
print(df_filled) # # A tibble: 9 × 4 # ID Age Date Value1 # <chr> <dbl> <date> <dbl> # 1 A1 0 2006-05-03 6 # 2 A1 1 2006-05-04 6 # 3 A1 2 2006-05-05 6 # 4 A1 3 2006-05-06 6 # 5 A1 4 2006-05-07 6 # 6 B1 0 2006-06-02 4 # 7 B1 1 2006-06-03 4 # 8 B1 2 2006-06-04 4 # 9 B1 3 2006-06-05 4
为什么你的原代码不行?
你的原代码用了min(df$Date, na.rm = TRUE)和max(df$Date, na.rm = TRUE),这是取整个数据集的日期范围,不是每个ID自己的日期区间,而且没有把补全的日期和Age关联起来,导致新生成的日期行找不到对应的Age和Value1,所以这些列就变成了NA。
而上面的方案利用了Age是天数的核心信息,每个ID的起始日期是确定的,直接用起始日期加Age就能精准得到对应日期,再通过fill保留固定的Value1,完美解决你的需求。
内容的提问来源于stack exchange,提问作者Kriszti
相关产品推荐
相关产品推荐

