如何使用R提取具有相同时间的一对一匹配数据

时间:2019-02-09 12:54:16

标签: r

我有两个数据集:a和b。它们是测量数据,其中大多数是同时测量的,其余的则无法匹配。例如:

startService()

我想过滤那些测量时间相同的数据,以便我可以匹配它们并在以后进行分析。也就是说,过滤后的数据集a和b应该为:

a:

stopSelf()

b:

stopService()

操作后,a和b在同一日期进行测量:2010/12/15 13:18和2011/3/8 11:52。 有人可以在R中达到这个目的吗?

2 个答案:

答案 0 :(得分:2)

如果您希望将结果作为一个新的data.frame,并且只包含ab中都存在的时间:

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

或者要保留所有行,并用NA填充,其中measuretime不存在,可以使用all参数设置为TRUE:< / p>

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

答案 1 :(得分:2)

注释

我强烈建议您将时间戳比较为字符串,并首先将其转换为时间戳/日期格式,如下所示。其背后的原因主要与以下方面有关:

  • 与以不同格式编码的时间戳有关的可能错误,其中包含时区,毫秒等。
  • 使用相同的标记,通俗地定义为“相同时间”的内容将根据测量系统的特殊性等而以不同的方式表达。实际上,经常会感兴趣的是比较在同一时间间隔内发生的事件。假设事件 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")
    )