微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据id和时间连接两个时间序列

如何解决根据id和时间连接两个时间序列

我想根据一个 ID 变量连接两个时间序列。

我的第一个时间系列,

library(tidyverse)
library(lubridate)

id <- c(11,11,12,12)
time <- c("2020-11","2020-12","2021-01","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","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,将导致笛卡尔连接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。