我正在准备货币值的统计数据,我每天都有货币值,每年都在一个单独的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
不起作用,因为列数不同。我该如何组合这些数据框?
答案 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