r-加入基于id和时间的两个时间序列



我想加入两个基于ID变量的时间序列。

我的第一个时间序列,

library(tidyverse)
library(lubridate)
id <- c(11, 11, 11, 12, 12)
time <- c("2020-11", "2020-12", "2021-01", "2020-12", "2021-01")
values <- c(10, 20, 25, 100, 200)
data1 <- data.frame(id, time, values)
data1$time <- ym(data1$time)

第二个时间序列如下,

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)

请注意,第一个数据帧有5行,第二个有7行。连接的数据帧应该有5行。

现在我想通过id和date将第二个数据帧连接到第一个数据帧中。,我正在做以下事情

newdata <- dplyr::inner_join(data1, data2, by = "time")
newdata
> newData
id       Time values trend
1 11 2020-11-01     10   0.2
2 11 2020-12-01     20   0.3
3 11 2020-12-01     20   0.5
4 11 2021-01-01     25   0.4
5 11 2021-01-01     25   0.6
6 12 2020-12-01    100   0.3
7 12 2020-12-01    100   0.5
8 12 2021-01-01    200   0.4
9 12 2021-01-01    200   0.6

这不是我想要的。id中有重复。数据帧有9行,而不是5行。我的预期输出应该是,

> newData
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

知道如何做到这一点吗?

base R中,我们可以使用match来获取位置并提取相应的值

newData <- data1
newData$trend <- data2$trend[match(data1$time, data2$time)]

-输出

newData
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

如果我们在两个数据集中执行merge或使用重复的by进行联接,则会导致笛卡尔联接

最新更新