Как извлечь данные о совпадении один к одному, которые имеют то же время, используя R - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть два набора данных: a & b.Это измеренные данные, большинство из которых измеряются одновременно, а остальные не могут быть сопоставлены.Например:

a<-data.frame(measuretime=c("2010-10-20 11:00:00", "2010-12-15 13:18:00", "2011-02-14 09:00:00", 
                            "2011-03-08 11:52:00", "2012-08-23 22:59:00"), value=c(1.5, 6.3, 0.1, 9.9, 7))
b<-data.frame(measuretime=c("2010-12-15 13:18:00", "2011-02-14 10:30:00", 
                            "2011-03-08 11:52:00", "2011-04-18 12:23:00"), value=c(22, 71, 12, 69))

Я хочу отфильтровать те данные, чье измеренное время одинаково, чтобы я мог сопоставить их и проанализировать позже.То есть наборы данных a и b после фильтрации должны быть:

a:

  measuretime      value
2010/12/15 13:18    6.3
2011/3/8 11:52      9.9

b:

  measuretime      value
2010/12/15 13:18    22
2011/3/8 11:52      12

После операции измеряются a и bв тот же день: 2010/12/15 13:18 и 2011/3/8 11:52.Может ли кто-нибудь иметь метод для достижения этого в R?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Примечания

Я настоятельно призываю вас , а не сравнивать временные метки в виде строк и первоначально переводить их в формат меток времени / даты, как это предлагается ниже.Причины этого в основном связаны с:

  • возможными ошибками, связанными с метками времени, закодированными в разных форматах, содержащих часовые пояса, миллисекунды и т. Д.
  • По тому же признаку то, что в разговорной речи определяется как «одно и то же время», будет выражаться по-разному в зависимости от особенностей системы измерения и т. Д. На практике часто будет интересоваться сравнение событий, происходящих в одном и том жеинтервал.Допустим, событие B происходит в пределах +/- 5 seconds от события A.

Примечания к решению

  • Предлагаемое здесь решение является упрощенным и округляет до минуты, используя функции, предлагаемые в пакете lubridate.Вы можете подумать, подходит ли это, или было бы разумнее ввести более сложный подход и / или сравнить события в течение того же часа / дня
  • . Я бы посоветовал вам взглянуть на ?lubridate::interval, чтобы увидетьбудет ли полезно строить интервалы в этом контексте
  • Фактически вы никогда не будете сравнивать события, которые произошли одновременно;вы будете сравнивать события, которые записаны в то же время.Ваше определение «в то же время» зависит от точности инструмента и степени детализации хранимых данных.Если ваш инструмент фиксирует минуты, события, записанные в одну и ту же минуту, будут считаться происходящими в одно и то же время.На мой взгляд, более надежно явно зафиксировать это в своем коде.

Код

# Data --------------------------------------------------------------------

a <-
    data.frame(
        measuretime = c(
            "2010-10-20 11:00:00",
            "2010-12-15 13:18:00",
            "2011-02-14 09:00:00",
            "2011-03-08 11:52:00",
            "2012-08-23 22:59:00"
        ),
        value = c(1.5, 6.3, 0.1, 9.9, 7)
    )
b <-
    data.frame(
        measuretime = c(
            "2010-12-15 13:18:00",
            "2011-02-14 10:30:00",
            "2011-03-08 11:52:00",
            "2011-04-18 12:23:00"
        ),
        value = c(22, 71, 12, 69)
    )


# Timestamps --------------------------------------------------------------

suppressPackageStartupMessages(expr = {
    library("tidyverse")
    library("magrittr")
    library("lubridate")
})

# Create timestamp columns

a %<>%
    mutate(measuretime_ts = as_datetime(measuretime))

b %<>%
    mutate(measuretime_ts = as_datetime(measuretime))


# Compare -----------------------------------------------------------------

# Round columns to a minute and leave only columns that 
# are recorded as at the same minute after rounding

a %>%
    mutate(measuretime_ts_rnd = round_date(x = measuretime_ts,
                                           unit = "minute")) %>%
    inner_join(
        y = b %>%
            mutate(measuretime_ts_rnd = round_date(x = measuretime_ts,
                                                   unit = "minute")),
        by = c("measuretime_ts_rnd" = "measuretime_ts_rnd")
    )
0 голосов
/ 09 февраля 2019

Если вы хотите получить результат в виде нового data.frame с только временем, существующим как в a, так и b:

c <- merge(a, b, by = "measuretime")

Или сохранитьвсе строки, заполненные NA, где measuretime не существует в другом, вы можете использовать параметр all, установленный в TRUE:

d <- merge(a, b, by = "measuretime", all = TRUE)

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