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

时间:2015-01-13 20:28:56

标签: r

我正在寻找一种清理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 

2 个答案:

答案 0 :(得分:0)

假设'日期'是唯一的,您可以将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

join包中还有plyr个功能。但请注意,结果数据框不按日期排序。

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

答案 1 :(得分:0)

另一种方法是使用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

<强> EXTRA

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

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