Операция, которую вы хотите выполнить здесь, называется join
, в частности, вы хотите left_join
df2 с df1, чтобы сохранить все строки в df2, а затем добавить соответствующие столбцы из df1.
Чтобы узнать больше о соединениях и их использовании в R, прочитайте следующий вопрос: Как объединить (объединить) фреймы данных (внутренний, внешний, левый, правый)
СложностьЗдесь факт, что столбцы date
отключены на одну секунду.Чтобы работать с этим, нам просто нужно изменить date
с помощью lubridate::dseconds
перед присоединением.
Сначала мы берем ваши данные и гарантируем, что date
отформатирован как POSIXct
с использованием lubridate::as_datetime
, поэтому мыможет работать с ним как с датой.
Это даст нам следующие рамки данных на основе ваших данных:
df1 <- structure(list(general_id = c(6L, 2L, 3L, 2L, 7L), date = structure(c(946832233,
946841173, 946992613, 947012593, 947176333), class = c("POSIXct",
"POSIXt"), tzone = "UTC")), row.names = c(NA, -5L), class = "data.frame")
df2 <- structure(list(general_id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), date = structure(c(946832232, 947177832, 946841172, 946841172,
946992612, 946992612, 947012592, 947012592, 947176332), class = c("POSIXct",
"POSIXt"), tzone = "UTC")), row.names = c(NA, -9L), class = "data.frame")
Теперь мы можем сделать join
, но обратите внимание, что мы модифицируем df1$date
в соединении с помощью dplyr::mutate
:
library(dplyr)
left_join(df2, mutate(df1, date = date - lubridate::dseconds(1)), by = 'date')
general_id.x date general_id.y
1 1 2000-01-02 16:57:12 6
2 1 2000-01-06 16:57:12 NA
3 1 2000-01-02 19:26:12 2
4 1 2000-01-02 19:26:12 2
5 1 2000-01-04 13:30:12 3
6 1 2000-01-04 13:30:12 3
7 1 2000-01-04 19:03:12 2
8 1 2000-01-04 19:03:12 2
9 1 2000-01-06 16:32:12 7
Как видите, мы добавили соответствующий столбец general_id
из df1
.Затем мы можем сбросить general_id.x
и переименовать general_id.y
, если это необходимо.Обратите внимание, что строка 2 возвращает NA
, поскольку в df1
нет совпадений (время совпадает, но день другой)