如何用最接近午夜的有效值替换时间序列数据框中的NA值?
问题描述
我有一个按时间排序的数据框:
df1 <- read.table(text = "DT odczyt.1 '2023-08-16 00:00:00' 482 '2023-08-16 23:55:00' 483 '2023-08-17 00:00:00' 484 '2023-08-17 23:59:45' 485 '2023-08-18 00:00:00' 486 '2023-08-18 23:50:45' 487 '2023-08-19 00:00:00' NA '2023-08-19 00:00:45' NA '2023-08-19 00:01:00' NA '2023-08-19 00:01:15' 489 '2023-08-19 23:59:30' 490 '2023-08-19 23:59:45' NA '2023-08-20 00:00:00' NA '2023-08-20 00:03:00' NA '2023-08-20 00:04:15' NA '2023-08-20 00:07:00' 492 '2023-08-20 23:59:45' 493 '2023-08-21 00:00:00' NA '2023-08-21 07:00:30' 493 '2023-08-21 13:21:45' 495", header = TRUE)
部分日期的午夜(00:00:00)对应的odczyt.1值为NA,需要用该日期内最接近午夜的有效值替换这些NA(有效值可能在午夜之前或之后),同时保留数据框的最后一行。期望输出如下:
> df1.r DT odczyt.1 1 2023-08-16 00:00:00 482 2 2023-08-17 00:00:00 484 3 2023-08-18 00:00:00 486 4 2023-08-19 00:00:00 489 5 2023-08-20 00:00:00 490 6 2023-08-21 00:00:00 493 7 2023-08-21 13:21:45 495
解决方案
使用dplyr和lubridate包实现需求,代码如下:
# 加载依赖包 library(dplyr) library(lubridate) # 处理数据并生成目标结果 df1.r <- df1 %>% # 转换时间列格式为datetime mutate(DT = ymd_hms(DT)) %>% # 计算每条记录距离当日午夜的时间差绝对值,提取日期用于分组 mutate( date = as_date(DT), midnight = ymd_hms(paste(date, "00:00:00")), time_diff = abs(difftime(DT, midnight, units = "secs")) ) %>% # 按日期分组,找到每组中距离午夜最近的有效值 group_by(date) %>% mutate(closest_valid = odczyt.1[which.min(time_diff[!is.na(odczyt.1)])]) %>% ungroup() %>% # 筛选出所有午夜行和原数据的最后一行 filter(DT == midnight | row_number() == n()) %>% # 替换午夜行的NA值为对应日期的最近有效值 mutate(odczyt.1 = ifelse(DT == midnight & is.na(odczyt.1), closest_valid, odczyt.1)) %>% # 保留目标列并按时间排序 select(DT, odczyt.1) %>% arrange(DT)
执行后输出结果与期望一致:
print(df1.r) #> DT odczyt.1 #> 1 2023-08-16 00:00:00 482 #> 2 2023-08-17 00:00:00 484 #> 3 2023-08-18 00:00:00 486 #> 4 2023-08-19 00:00:00 489 #> 5 2023-08-20 00:00:00 490 #> 6 2023-08-21 00:00:00 493 #> 7 2023-08-21 13:21:45 495
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

