Данные, показанные в вопросе, кажутся немного противоречивыми (например, откуда взято «39»?), Но я подозреваю, что это можно решить с помощью объединений / слияний.
Некоторые расходные данные:
A <- read.table(header=TRUE, stringsAsFactors = FALSE, text="
Price Date
100 2018-10-14
103 2018-10-16
102 2018-10-18")
B <- read.table(header=TRUE, stringsAsFactors = FALSE, text="
Date Forex_Rate
2018-10-14 28
2018-10-15 22
2018-10-16 30")
База R
merge(A, B, by = "Date", all = TRUE)
# Date Price Forex_Rate
# 1 2018-10-14 100 28
# 2 2018-10-15 NA 22
# 3 2018-10-16 103 30
# 4 2018-10-18 102 NA
dplyr
dplyr::full_join(A, B, by = "Date")
# Price Date Forex_Rate
# 1 100 2018-10-14 28
# 2 103 2018-10-16 30
# 3 102 2018-10-18 NA
# 4 NA 2018-10-15 22
data.table
library(data.table)
ADT <- as.data.table(A)
BDT <- as.data.table(B)
merge(ADT, BDT, by = "Date", all = TRUE)
# Date Price Forex_Rate
# 1: 2018-10-14 100 28
# 2: 2018-10-15 NA 22
# 3: 2018-10-16 103 30
# 4: 2018-10-18 102 NA
Это выглядит так же, но подКапот использует data.table:::merge.data.table
, что сохраняет некоторые из data.tables
вспомогательных преимуществ.Однако, если вы хотите выполнить левое соединение, его синтаксис все еще может использовать merge
или использовать немного другой синтаксис:
# equivalent to dplyr::left_join(ADT, BDT, by = "Date") or merge(ADT, BDT, by = "Date", all.x = TRUE)
BDT[ADT, on = "Date"]
# Date Forex_Rate Price
# 1: 2018-10-14 28 100
# 2: 2018-10-16 30 103
# 3: 2018-10-18 NA 102