Вы можете пойти на full_join
от dplyr
. Я бы предложил загрузить tidyverse
, на случай, если задача станет более сложной (см. Примеры ниже).
Пример кадра данных:
df1 <- data.frame(time = c("2012-01-01"), var_A = c(3))
df2 <- data.frame(time = c("2010-01-01", "2012-01-01"), var_B = c(3, 2))
df3 <- data.frame(time = c("2011-01-01", "2012-01-01"), var_C = c(0, 0))
Код:
library(tidyverse)
df <- df1 %>%
full_join(df2, by = "time") %>%
full_join(df3, by = "time")
Выход:
df
time var_A var_B var_C
1 2012-01-01 3 2 0
2 2010-01-01 NA 3 NA
3 2011-01-01 NA NA 0
Это также можно сократить:
library(tidyverse)
df <- list(df1, df2, df3) %>%
reduce(full_join, by = "time")
Выход:
time var_A var_B var_C
1 2012-01-01 3 2 0
2 2010-01-01 NA 3 NA
3 2011-01-01 NA NA 0
Если вам это нужно, вы всегда можете использовать arrange
впоследствии.
P.S. Если вам не хватает некоторых дат в этой последовательности в ваших фреймах данных, вы можете просто добавить несколько строк в оператор, чтобы дополнить их (я также добавил оператор replace
, чтобы заполнить NA 0):
library(tidyverse)
list(df1, df2, df3) %>%
reduce(full_join, by = "time") %>%
mutate(time = as.Date(time)) %>%
complete(time = seq.Date(as.Date("2000-01-01"), as.Date("2010-01-01"), by="month")) %>%
replace(., is.na(.), 0)
В вышеприведенном случае я добавил последовательность от 2000-01-01
до 2010-01-01
по месяцам, но вы также можете изменить ее на min(time)
и max(time)
или что вам больше подходит.