多个 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
我正在寻找一种在 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