组合具有不同列数的多个数据帧

时间:2014-06-26 12:47:07

标签: r dataframe

我正在准备货币值的统计数据,我每天都有货币值,每年都在一个单独的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

但其中一些有更多的colums(额外货币),如:

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不起作用,因为列数不同。我该如何组合这些数据框?

2 个答案:

答案 0 :(得分:4)

Henrik提到,rbind.fill包中的plyr在这里非常有用:

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  

答案 1 :(得分:3)

我建议将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