如何合并时间不匹配、列不同的两个时间序列DataFrame?
问题解决
基础需求:全外连接并按时间排序
直接用merge或left_join达不到效果的原因:
merge默认是内连接,只保留两表timeStamp完全匹配的行,不会包含各自独有的时间点left_join以左表为基准,不会纳入右表中左表没有的时间行
要实现全量时间保留、不匹配列填NA、按时间排序,有两种实现方式:
方法1:Base R 实现
# 执行全外连接,再按时间戳排序 merged_df <- merge(df1, df2, by = "timeStamp", all = TRUE) merged_df <- merged_df[order(merged_df$timeStamp), ]
方法2:Tidyverse 工具包实现
library(dplyr) merged_df <- full_join(df1, df2, by = "timeStamp") %>% arrange(timeStamp)
运行后得到的基础结果:
timeStamp value text 1 2022-07-29 00:00:00 1 <NA> 2 2022-07-29 00:00:05 NA a 3 2022-07-29 00:05:00 2 <NA> 4 2022-07-29 00:05:05 NA b 5 2022-07-29 00:10:00 3 <NA> 6 2022-07-29 00:15:00 4 <NA> 7 2022-07-29 00:20:00 5 <NA> 8 2022-07-29 00:20:05 NA c
进阶需求:填充text直到下一次变化
在基础合并结果的基础上,用tidyr的fill函数向下填充NA值即可:
library(dplyr) library(tidyr) final_df <- full_join(df1, df2, by = "timeStamp") %>% arrange(timeStamp) %>% fill(text, .direction = "down")
运行后得到的进阶结果:
timeStamp value text 1 2022-07-29 00:00:00 1 <NA> 2 2022-07-29 00:00:05 NA a 3 2022-07-29 00:05:00 2 a 4 2022-07-29 00:05:05 NA b 5 2022-07-29 00:10:00 3 b 6 2022-07-29 00:15:00 4 b 7 2022-07-29 00:20:00 5 b 8 2022-07-29 00:20:05 NA c
如果不用Tidyverse,也可以用Base R结合zoo包实现:
library(zoo) merged_df <- merge(df1, df2, by = "timeStamp", all = TRUE) merged_df <- merged_df[order(merged_df$timeStamp), ] merged_df$text <- na.locf(merged_df$text, na.rm = FALSE)
内容的提问来源于stack exchange,提问作者ambergris
相关产品推荐
相关产品推荐

