多个 CSV 导入到缺少关键数据的 R

Multiple CSVs to import into R with missing key data

我正在寻找一种在 R 中清理数据集的方法。数据位于多个 CSV 文件中。我的问题出在缺少数据的地方。我想将多个货币对的所有收盘价合并到一个数据框中。我一直无法找到将这些价格合并到相关日期的方法,因为缺少日期(实际上是分钟)。因此,例如,第一个 CSV 具有日期 1、2、3、4 以及相关价格。 CSV 2 具有日期 1、3、4 以及相关价格。我想我只是想从 CSV 中删除日期,只是不知道该怎么做。

    CSV 1                 CSV 2
Date    USD/EUR       Date      JPY/USD
1       1.00           1         2.00
2       1.01           3         3.10 
3       1.03           4         2.00
4       1.01 

假设 'Date' 是唯一的,您可以使用 merge 作为 base 解决方案

csv1 <- read.csv("csv1.csv", header=T)
csv2 <- read.csv("csv2.csv", header=T)

merge(csv2, csv1, by="Date", all.y=TRUE)

  Date JPY/USD USD.EUR
1    1     2.0    1.00
2    2      NA    1.01
3    3     3.1    1.03
4    4     2.0    1.01

plyr包中还有join功能。但是请注意,生成的数据框不是按日期排序的。

join(csv2, csv1, by="Date", type="full")

  Date JPY/USD USD.EUR
1    1     2.0    1.00
2    3     3.1    1.03
3    4     2.0    1.01
4    2      NA    1.01

或者,如果您想开始探索有价值的 data.table 包,您可以很容易地做同样的事情。

require(data.table)
dt1 <- data.table(csv1, key="Date")
dt2 <- data.table(csv2, key="Date")
dt3 <- dt2[dt1, ]
dt3

   Date JPY/USD USD.EUR
1:    1     2.0    1.00
2:    2      NA    1.01
3:    3     3.1    1.03
4:    4     2.0    1.01

另一种方法是使用 dplyr 而不是 plyr。开发版本 (dplyr 0.4) 有 full_join.

csv1 <- data.frame(Date = c(1, 2, 3, 4),
                   USDEUR = c(1, 1.01, 1.03, 1.01))

csv2 <- data.frame(Date = c(1, 3, 4),
                   JPYEUR = c(2, 3.1, 2))

full_join(csv1, csv2, by = "Date")

#  Date USDEUR JPYEUR
#1    1   1.00    2.0
#2    2   1.01     NA
#3    3   1.03    3.1
#4    4   1.01    2.0

额外

我刚刚检查了每个选项需要多少时间。这不是一个合适的基准,但这会给你一个想法。

set.seed(123)
csv1 <- data.frame(Date = seq(from = 1, to = 1000000, by = 1),
                   USDEUR = runif(1000000, 1, 1.50))

csv2 <- data.frame(Date = sample.int(c(1, 1000000),950000, replace = TRUE),
                   JPYEUR = runif(950000, 2, 3.2))


system.time(merge(csv2, csv1, by = "Date", all.y = TRUE))
#   user  system elapsed 
# 11.395   0.272  11.590 

system.time(join(csv2, csv1, by = "Date", type = "full"))
#   user  system elapsed 
#  3.510   0.282   3.713

system.time(full_join(csv1, csv2, by = "Date"))
#   user  system elapsed 
#  0.863   0.040   0.894 

dt1 <- setDT(csv1)
dt2 <- setDT(csv2)

setkey(dt1, "Date")
setkey(dt2, "Date")

system.time(dt2[dt1, ])
#   user  system elapsed 
#  0.072   0.008   0.079