我想加入两个基于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
进行联接,则会导致笛卡尔联接