【问题标题】:Joining two time series based on id and time根据 id 和 time 加入两个时间序列
【发布时间】:2021-06-24 16:54:41
【问题描述】:

我想根据一个 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 和日期将第二个数据框加入第一个数据框。我正在执行以下操作,

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

知道如何实现吗?

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    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,则会导致笛卡尔连接

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多