R语言如何基于ID与时间合并两个时间序列数据框
问题根因
你得到9行结果的核心原因是data2中存在重复time值:2020-12、2021-01各对应2个不同的trend取值,仅按time字段关联时会产生笛卡尔积,导致行数膨胀。
另外你提供的data2构造代码存在笔误:定义列名时大写了Time,但前面创建的变量是小写time,实际运行会报错,需要先修正为小写。
解决方案
你的预期结果中,每个时间匹配的是data2里对应时间的第一个trend取值,因此先对data2按时间去重,再做关联即可:
library(tidyverse) library(lubridate) # 先修正data2的构造笔误 time <- c("2020-10", "2020-11", "2020-12", "2021-01", "2020-12", "2021-01", "2021-02") trend <- c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7) data2 <- data.frame(time, trend) data2$time <- ym(data2$time) # 对data2按time去重,保留每个时间第一次出现的trend值 data2_unique <- data2 %>% distinct(time, .keep_all = TRUE) # 关联两个表,得到5行结果 newData <- inner_join(data1, data2_unique, by = "time")
运行后输出和你给出的预期完全一致:
id time values trend 1 11 2020-11-01 10 0.2 2 11 2020-12-01 20 0.3 3 11 2021-01-01 25 0.4 4 12 2020-12-01 100 0.3 5 12 2021-01-01 200 0.4
如果你的去重逻辑不是取第一个值,而是取trend的均值/最大值等,可先对data2按time分组汇总后再关联:
# 示例:按时间取trend的平均值 data2_agg <- data2 %>% group_by(time) %>% summarise(trend = mean(trend), .groups = "drop") newData <- inner_join(data1, data2_agg, by = "time")
内容的提问来源于stack exchange,提问作者JontroPothon
相关产品推荐
相关产品推荐

