merge
(и, следовательно, большинство join
-подобных операторов) могут не работать должным образом, если ваше время имеет разрешение менее секунды.Это относится ко всему с плавающей точкой (см. R FAQ 7.31 для плавающей точки в общем), где тесты равенства между непрерывными переменными проблематичны.
Дляэто, я предлагаю поиск по дальности.Это можно сделать с помощью cut
или (мое предложение здесь) findInterval
.В этом примере я изменил три раза X2
, чтобы показать что-то интересное, а именно: показать несколько разных совпадений и отсутствие совпадений (вне диапазона).
Допущения: X1$Time
не убывает;$Time
относятся к классу POSIXct
(и, следовательно, потенциально более решительны, чем "1 секунда").
( ind <- findInterval(X2$Time, X1$Time) )
# [1] 0 1 1 1 1 1 1 2 2
### that "0" is a problem, fix it
ind[ind < 1] <- NA
X2$Accx1 <- X1$Accx1[ ind ]
X2
# Time Accx2 Accx1
# 1 2019-03-28 07:47:06 2 NA # this is b/c the ":06" is before X1 starts
# 2 2019-03-28 07:47:07 8 5
# 3 2019-03-28 07:47:07 1 5
# 4 2019-03-28 07:47:07 9 5
# 5 2019-03-28 07:47:07 1 5
# 6 2019-03-28 07:47:07 1 5
# 7 2019-03-28 07:47:07 2 5
# 8 2019-03-28 07:47:08 3 1
# 9 2019-03-28 07:47:08 1 1
Шаг ind[ind < 1]
состоит в том, что экземпляры, которые происходят до того, как первый X1$Time
получит0
, что сокращает возвращаемое значение (ошибка: replacement has 8 rows, data has 9
).Заменив их на NA
, по крайней мере, вектор замены
Данные немного скомбинировали (добавьте / удалите _
) для облегчения чтения.
X1 <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Time Accx1
2019-03-28_07:47:07 5
2019-03-28_07:47:08 1
2019-03-28_07:47:09 7")
X1$Time <- as.POSIXct(X1$Time, format = "%Y-%m-%d_%H:%M:%S")
X2 <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Time Accx2
2019-03-28_07:47:06 2
2019-03-28_07:47:07 8
2019-03-28_07:47:07 1
2019-03-28_07:47:07 9
2019-03-28_07:47:07 1
2019-03-28_07:47:07 1
2019-03-28_07:47:07 2
2019-03-28_07:47:08 3
2019-03-28_07:47:08 1")
X2$Time <- as.POSIXct(X2$Time, format = "%Y-%m-%d_%H:%M:%S")