如何让tidyr::fill函数按分组填充数据行
解决方案:合并同时间戳的多行数据并填充NA
你的核心需求是将同一TIMESTAMP(及对应RECORD)的多行数据合并为一行,填充所有列的NA值,同时忽略最后一列。原代码仅完成了NA填充但未做去重处理,因此无法得到预期的两行结果,以下是两种可行方案:
方案一:直接汇总提取非NA值
利用dplyr的分组汇总功能,对每个分组内的列提取唯一非NA值(同一分组内每个列仅存在一个有效数据):
library(dplyr) cleaned_data <- my_data[, -ncol(my_data)] %>% # 按TIMESTAMP和RECORD分组(二者一一对应,分组逻辑更严谨) group_by(TIMESTAMP, RECORD) %>% # 对所有列提取第一个非NA值 summarise(across(everything(), ~ first(na.omit(.))), .groups = "drop") # 查看处理后的数据 cleaned_data
方案二:填充NA后去重
先通过双向填充补全同一分组内的所有NA值,再保留每个TIMESTAMP的唯一行:
library(dplyr) library(tidyr) cleaned_data <- my_data[, -ncol(my_data)] %>% group_by(TIMESTAMP) %>% # 双向填充(先向下再向上),确保所有NA被补全 fill(everything(), .direction = "downup") %>% # 按TIMESTAMP去重,保留所有列的完整数据 distinct(TIMESTAMP, .keep_all = TRUE) # 查看处理后的数据 cleaned_data
结果说明
两种方案处理后都会得到2行数据,其中WndSpd5s_3m_Avg和WndMaxSpd5s_3m_Avg列的NA会被填充为对应分组的有效数值,其余列保持原有一致值。
内容的提问来源于stack exchange,提问作者user8229029
相关产品推荐
相关产品推荐

