我有两个数据集:a和b。它们是测量数据,其中大多数是同时测量的,其余的则无法匹配。例如:
startService()
我想过滤那些测量时间相同的数据,以便我可以匹配它们并在以后进行分析。也就是说,过滤后的数据集a和b应该为:
a:
stopSelf()
b:
stopService()
操作后,a和b在同一日期进行测量:2010/12/15 13:18和2011/3/8 11:52。 有人可以在R中达到这个目的吗?
答案 0 :(得分:2)
如果您希望将结果作为一个新的data.frame,并且只包含a
和b
中都存在的时间:
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")
)