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