Как сравнить даты в разных фреймах данных и присвоить значения одному и тому же столбцу в одном фрейме одного и того же столбца в другом фрейме данных? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть пример фрейма данных, как показано ниже

Dataframe1.

  general_id                date
    6              2000-01-02 16:57:13
    2              2000-01-02 19:26:13
    3              2000-01-04 13:30:13
    2              2000-01-04 19:03:13
    7              2000-01-06 16:32:13

Dataframe2.

  general_id                date
    1              2000-01-02 16:57:12
    1              2000-01-06 16:57:12
    1              2000-01-02 19:26:12
    1              2000-01-02 19:26:12
    1              2000-01-04 13:30:12
    1              2000-01-04 13:30:12
    1              2000-01-04 19:03:12
    1              2000-01-04 19:03:12
    1              2000-01-06 16:32:12

есть только вторая разница в обоих столбцах даты во фреймах данных. я хочу сравнить столбцы даты обоих фреймов данных и назначить значения столбца general_id в Dataframe1 столбцу general_id в Dataframe2

     date1 <- Dataframe1$date-dsecond(1)
     date2 <- Dataframe1$date

     if(date1==date2){
       dataframe2$general_id=dataframe1$general_id
     }

но я получаю эту ошибку,

In if (date1 == date2) the condition has length > 1 and only the first element will be used

Желаемый результат:

Dataframe1

          general_id                date
            6              2000-01-02 16:57:13
            2              2000-01-02 19:26:13
            3              2000-01-04 13:30:13
            2              2000-01-04 19:03:13
            7              2000-01-06 16:32:13

Dataframe2

             general_id                date
               6              2000-01-02 16:57:12
               6              2000-01-06 16:57:12
               2              2000-01-02 19:26:12
               2              2000-01-02 19:26:12
               3              2000-01-04 13:30:12
               3              2000-01-04 13:30:12
               2              2000-01-04 19:03:12
               2              2000-01-04 19:03:12
               7              2000-01-06 16:32:12
               7              2000-01-06 16:32:12

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Следующий код проверяет разницу во времени между датами в столбце даты менее 2 секунд.Чтобы оно совпадало с точностью до 1 секунды разницы во времени только в одном направлении, измените оператор which.

for (i in 1:nrow(Dataframe2)) {
  corresponding_row <- which(abs(as.POSIXct(Dataframe1$date)-as.POSIXct(Dataframe2$date[i]))<2)
  message('row ', i, ' of Dataframe2 corresponds to row ', corresponding_row, ' of Dataframe1') 
  Dataframe2$id[i] <- ifelse(length(corresponnding_row), Dataframe1$id[corresponding_row], NA)
}
0 голосов
/ 10 апреля 2019

Операция, которую вы хотите выполнить здесь, называется 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 нет совпадений (время совпадает, но день другой)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...