【问题标题】:Merge two dataframes by time and variable ID in R在R中按时间和变量ID合并两个数据帧
【发布时间】:2017-09-10 10:50:23
【问题描述】:

我目前在 R 中使用 48 种货币,并希望合并或覆盖两个数据集。

对于所有货币,我在 DF1 中有 1980 年到 2017 年的数据。对于其中的 16 个,我还拥有 DF2 中从 1970/1971 年到 2017 年的数据。我想做的是将 DF2 的 1970-1980 部分放在 DF1 的顶部。我想如果我设法将 DF1 合并到 DF2 中以获取它们都具有值的单元格(因此 DF1 覆盖 DF2),我想我会得到相同的结果。但是,并非所有货币的开始日期都完全相同,所以我不能硬编码。

下面是一个示例,向您展示它的外观: Date是时间变量(每月数据)。 DF1 对应于 1980-2017 年的数据,DF2 对应于 1970-2017 年的数据。我的目标是根据列 ID 和行 ID 将 DF1 中的值覆盖到 DF2 中。 DF3 是所需的输出。

DF1=data.frame(matrix(data=c(c(4:9),rnorm(12)),6,3))
DF2=data.frame(matrix(data=c(c(1:12),rnorm(36)),12,4))
names(DF1)=c("Date","Currency1","Currency3")
names(DF2)=c("Date","Currency1","Currency2","Currency3")

> DF1
  Date  Currency1  Currency3
1    4 -0.8356286  0.5757814
2    5  1.5952808 -0.3053884
3    6  0.3295078  1.5117812
4    7 -0.8204684  0.3898432
5    8  0.4874291 -0.6212406
6    9  0.7383247 -2.2146999

> DF2
   Date   Currency1   Currency2  Currency3
1     1  1.12493092 -0.15579551  1.1000254
2     2 -0.04493361 -1.47075238  0.7631757
3     3 -0.01619026 -0.47815006 -0.1645236
4     4  0.94383621  0.41794156 -0.2533617
5     5  0.82122120  1.35867955  0.6969634
6     6  0.59390132 -0.10278773  0.5566632
7     7  0.91897737  0.38767161 -0.6887557
8     8  0.78213630 -0.05380504 -0.7074952
9     9  0.07456498 -1.37705956  0.3645820
10   10 -1.98935170 -0.41499456  0.7685329
11   11  0.61982575 -0.39428995 -0.1123462
12   12 -0.05612874 -0.05931340  0.8811077

> DF3
   Date   Currency1   Currency2  Currency3
1     1  1.12493092 -0.15579551  1.1000254
2     2 -0.04493361 -1.47075238  0.7631757
3     3 -0.01619026 -0.47815006 -0.1645236
4     4 -0.83562861  0.41794156  0.5757814
5     5  1.59528080  1.35867955 -0.3053884
6     6  0.32950777 -0.10278773  1.5117812
7     7 -0.82046838  0.38767161  0.3898432
8     8  0.48742905 -0.05380504 -0.6212406
9     9  0.73832471 -1.37705956 -2.2146999
10   10 -1.98935170 -0.41499456  0.7685329
11   11  0.61982575 -0.39428995 -0.1123462
12   12 -0.05612874 -0.05931340  0.8811077

【问题讨论】:

    标签: r dataframe merge overriding


    【解决方案1】:

    我们可以使用来自data.table 的join

    library(data.table)
    DF3 <- copy(DF2)
    nm1 <- names(DF1)[-1]
    setDT(DF3)[DF1, (nm1) := mget(paste0("i.", nm1)), on = .(Date)]
    DF3
    #     Date   Currency1   Currency2  Currency3
    # 1:    1  1.12493092 -0.15579551  1.1000254
    # 2:    2 -0.04493361 -1.47075238  0.7631757
    # 3:    3 -0.01619026 -0.47815006 -0.1645236
    # 4:    4 -0.83562860  0.41794156  0.5757814
    # 5:    5  1.59528080  1.35867955 -0.3053884
    # 6:    6  0.32950780 -0.10278773  1.5117812
    # 7:    7 -0.82046840  0.38767161  0.3898432
    # 8:    8  0.48742910 -0.05380504 -0.6212406
    # 9:    9  0.73832470 -1.37705956 -2.2146999
    #10:   10 -1.98935170 -0.41499456  0.7685329
    #11:   11  0.61982575 -0.39428995 -0.1123462
    #12:   12 -0.05612874 -0.05931340  0.8811077
    

    【讨论】:

    • 太棒了。我会在我的真实数据上尝试一下,谢谢。
    • 一个问题:如果我在 DF1 中有我不想覆盖 DF2 的 NA,我该如何处理?
    【解决方案2】:

    您还可以使用plyr:ldply 强制对两个数据帧进行行绑定,然后按日期使用group_by 和summarise_each(使用dplyr 包):

    df <- ldply(list(DF1, DF2))
    sums <- function(x) sum(x, na.rm=T)
    df %>% group_by(Date) %>% summarise_each(funs(sums))
    
    # A tibble: 12 × 4
        Date   Currency1  Currency3   Currency2
       <dbl>       <dbl>      <dbl>       <dbl>
    1      1 -0.62124058 -0.3942900  0.61982575
    2      2 -2.21469989 -0.0593134 -0.05612874
    3      3  1.12493092  1.1000254 -0.15579551
    4      4 -0.67138742  1.2506048 -1.47075238
    5      5  0.16745306  0.5738011 -0.47815006
    6      6  0.10820760  0.3224197  0.41794156
    7      7  2.41650200  0.3915750  1.35867955
    8      8  0.92340909  2.0684444 -0.10278773
    9      9  0.09850899 -0.2989125  0.38767161
    10    10  0.78213630 -0.7074952 -0.05380504
    11    11  0.07456498  0.3645820 -1.37705956
    12    12 -1.98935170  0.7685329 -0.41499456
    

    【讨论】:

    • 所以当涉及到位置时,你强制列相互匹配,然后覆盖数据?应该也可以,我会在数据集上试试,谢谢!
    • 是的。 ldply 基本上强制跨两个数据帧(DF1 和 DF2)进行 rbind,即使列参数不匹配也是如此。
    • 还有一个问题:这如何处理 DF1 中的潜在 NA?如果您在 DF1 Currency3 中创建两个第一个值? DF1$Currency3[1:2]=NA
    • 上面的函数sums &lt;- function(x) sum(x, na.rm=T)是为了处理潜在的NA。
    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 2014-04-14
    相关资源
    最近更新 更多