【问题标题】:Combining multiple data frames with different number of columns [duplicate]将具有不同列数的多个数据框组合起来[重复]
【发布时间】:2014-08-17 07:58:34
【问题描述】:

我正在准备货币价值的统计数据,我每天都有货币价值,每年都在一个单独的 Excel 文件中。我设法阅读了xls 文件,但我想合并每年的数据框。它们看起来像:

Date      EUR   SEK   NOR   PLN   ROM   SKR
1-1-1998  2,21  1,23  1,13  2,99  9,12  6,17
2-1-1998  1,13  12,2  2,11  9,22  1,11  2,33

但其中一些有更多的列(附加货币),例如:

Date      EUR   SEK   NOR   PLN   ROM   SKR   JKC
1-1-1998  2,21  1,23  1,13  2,99  9,12  6,17  1,11
2-1-1998  1,13  12,2  2,11  9,22  1,11  2,33  2,13

我只想这样合并它们:

Date      EUR   SEK   NOR   PLN   ROM   SKR
1-1-1998  2,21  1,23  1,13  2,99  9,12  6,17
2-1-1998  1,13  12,2  2,11  9,22  1,11  2,33
Date      EUR   SEK   NOR   PLN   ROM   SKR   JKC
1-1-1998  2,21  1,23  1,13  2,99  9,12  6,17  1,11
2-1-1998  1,13  12,2  2,11  9,22  1,11  2,33  2,13

等等。

我尝试使用merge(),但它将相同的值视为一个,rbind 不起作用,因为列数不同。我应该如何组合这些数据框?

【问题讨论】:

  • 您能否创建与其他数据框一致的空列(例如,为您的第一个数据框创建 JKC 列)以便 rbind 起作用?
  • 你为什么不按日期合并?您提出的格式包含大量冗余信息。

标签: r dataframe


【解决方案1】:

就像 Henrik 提到的,rbind.fill 来自 plyr packge 在这里非常有帮助:

library(plyr)

a <- data.frame(
     data = c('1-1-1998', '2-1-1998'),
     EUR = c(2.21, 1.13),
     SEK = c(1.23, 12.2)
)

b <- data.frame(
     data = c('1-1-1998', '2-1-1998'),
     EUR = c(2.21, 1.13),
     SEK = c(1.23, 12.2),
     JKC = c(1.11, 2.13)
)

rbind.fill(a, b)

导致:

      data  EUR   SEK  JKC
1 1-1-1998 2.21  1.23   NA
2 2-1-1998 1.13 12.20   NA
3 1-1-1998 2.21  1.23 1.11
4 2-1-1998 1.13 12.20 2.13  

【讨论】:

    【解决方案2】:

    我建议melt 将数据转换为长格式,这通常更容易用于 R 中的进一步分析:

    DF1 <- read.table(text="Date      EUR   SEK   NOR   PLN   ROM   SKR
    1-1-1998  2,21  1,23  1,13  2,99  9,12  6,17
    2-1-1998  1,13  12,2  2,11  9,22  1,11  2,33", header=TRUE, dec=",")
    
    DF2 <- read.table(text="Date      EUR   SEK   NOR   PLN   ROM   SKR   JKC
    1-2-1998  2,21  1,23  1,13  2,99  9,12  6,17  1,11
    2-2-1998  1,13  12,2  2,11  9,22  1,11  2,33  2,13", header=TRUE, dec=",")
    
    myfiles <- list(DF1, DF2) 
    #use lapply(list.files(yourpath), read.table, header=TRUE, dec=",") to create this list
    
    
    #reshape to long format
    library(reshape2)
    myfiles <- lapply(myfiles, melt, id.vars="Date", value.name="value", variable.name="currency")
    mydata <- do.call(rbind, myfiles)
    head(mydata)
    #      Date currency value
    #1 1-1-1998      EUR  2.21
    #2 2-1-1998      EUR  1.13
    #3 1-1-1998      SEK  1.23
    #4 2-1-1998      SEK 12.20
    #5 1-1-1998      NOR  1.13
    #6 2-1-1998      NOR  2.11
    

    如果必须,您可以重新调整为宽格式:

    dcast(mydata, Date~currency)
    #      Date  EUR   SEK  NOR  PLN  ROM  SKR  JKC
    #1 1-1-1998 2.21  1.23 1.13 2.99 9.12 6.17   NA
    #2 2-1-1998 1.13 12.20 2.11 9.22 1.11 2.33   NA
    #3 1-2-1998 2.21  1.23 1.13 2.99 9.12 6.17 1.11
    #4 2-2-1998 1.13 12.20 2.11 9.22 1.11 2.33 2.13
    

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 2015-04-30
      • 2020-12-24
      • 2021-03-20
      • 2020-06-05
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多