Как дублировать данные на основе совпадений в двух разных столбцах - PullRequest
0 голосов
/ 28 июня 2019

У меня есть данные акселерометра, отобранные на частоте 12,5 Гц.Для одного набора данных (X1) я сжал эти точки данных с интервалом в 1 секунду, но теперь мне нужно рекомбинировать его с другим столбцом (X2) (с выборкой на 12,5 Гц), чтобы сгенерировать уравнение.Я хочу продублировать значения в X1, если данные времени совпадают с X2

Мои файлы в настоящее время выглядят примерно так

X1
Time                           Accx1
2019-03-28 07:47:07            5
2019-03-28 07:47:08            1
2019-03-28 07:47:09            7

X2
Time                           Accx2
2019-03-28 07:47:07            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:07            3
2019-03-28 07:47:07            1


And I want them to look like this:
Time                           Accx1         Accx2
2019-03-28 07:47:07            5             2
2019-03-28 07:47:07            5             8
2019-03-28 07:47:07            5             1
2019-03-28 07:47:07            5             9
2019-03-28 07:47:07            5             1
2019-03-28 07:47:07            5             1
2019-03-28 07:47:07            5             2
2019-03-28 07:47:07            5             3
2019-03-28 07:47:07            5             1

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

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")
0 голосов
/ 28 июня 2019

Я верю, что вы ищете правильное соединение.Это должно работать:

merge(X1, X2, by = "Time", all.x = FALSE, all.y = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...