Я имею дело с большой серией времени с одним столбцом, содержащим четыре разных датчика, и одним столбцом, содержащим измеренные значения. Мне нужно назначить идентификатор для измерений, которые принадлежат к одному и тому же времени. Проблема в том, что время измерений немного отличается для каждого устройства, поэтому я не могу просто сгруппировать их по метке времени. В кадре данных, упорядоченном по времени, измерения, которые должны быть сгруппированы, могут быть идентифицированы последовательностями уникальных идентификаторов устройств. Проблема здесь в том, что в одно время 4 устройства записывают значение, а в другое время 3 устройства записывают значение. Мои данные выглядят так:
timestamp device measurement
1 2019-08-27 07:29:20.671313 sdr_03 49.868820
2 2019-08-27 07:29:20.932043 sdr_02 54.160831
3 2019-08-27 07:29:21.839312 sdr_03 48.974476
4 2019-08-27 07:29:21.850454 sdr_02 50.808674
5 2019-08-27 08:57:01.990833 sdr_03 50.533058
6 2019-08-27 08:57:02.022798 sdr_04 51.143322
7 2019-08-27 09:16:56.454308 sdr_02 57.447151
8 2019-08-27 09:16:56.482433 sdr_04 50.012745
9 2019-08-27 09:16:56.761776 sdr_01 71.500305
10 2019-08-27 09:16:57.305510 sdr_02 56.851177
11 2019-08-27 09:16:57.333628 sdr_04 60.390141
12 2019-08-27 09:16:57.612972 sdr_01 73.470345
, которые вы можете воспроизвести с помощью этого:
my_data<-data.frame(timestamp = c("2019-08-27 07:29:20.671313","2019-08-27 07:29:20.932043","2019-08-27 07:29:21.839312",
"2019-08-27 07:29:21.850454", "2019-08-27 08:57:01.990833","2019-08-27 08:57:02.022798",
"2019-08-27 09:16:56.454308", "2019-08-27 09:16:56.482433", "2019-08-27 09:16:56.761776",
"2019-08-27 09:16:57.305510" ,"2019-08-27 09:16:57.333628", "2019-08-27 09:16:57.612972"),
device=c("sdr_03", "sdr_02", "sdr_03", "sdr_02", "sdr_03" ,"sdr_04", "sdr_02", "sdr_04" ,"sdr_01", "sdr_02" ,"sdr_04",
"sdr_01"),
measurement=c(49.868820, 54.160831, 48.974476, 50.808674, 50.533058, 51.143322,57.447151,50.012745, 71.500305,56.851177,
60.390141, 73.470345)
)
Мне нужно присвоить одно и то же значение последовательным строкам, пока ни один из элементов в снова появляются предыдущие строки столбца устройства
timestamp device measurement match_id
1 2019-08-27 07:29:20.671313 sdr_03 49.868820 1
2 2019-08-27 07:29:20.932043 sdr_02 54.160831 1
3 2019-08-27 07:29:21.839312 sdr_03 48.974476 2
4 2019-08-27 07:29:21.850454 sdr_02 50.808674 2
5 2019-08-27 08:57:01.990833 sdr_03 50.533058 3
6 2019-08-27 08:57:02.022798 sdr_04 51.143322 3
7 2019-08-27 09:16:56.454308 sdr_02 57.447151 3
8 2019-08-27 09:16:56.482433 sdr_04 50.012745 4
9 2019-08-27 09:16:56.761776 sdr_01 71.500305 4
10 2019-08-27 09:16:57.305510 sdr_02 56.851177 4
11 2019-08-27 09:16:57.333628 sdr_04 60.390141 5
12 2019-08-27 09:16:57.612972 sdr_01 73.470345 5
, который вы можете получить:
my_data<-data.frame(timestamp = c("2019-08-27 07:29:20.671313","2019-08-27 07:29:20.932043","2019-08-27 07:29:21.839312",
"2019-08-27 07:29:21.850454", "2019-08-27 08:57:01.990833","2019-08-27 08:57:02.022798",
"2019-08-27 09:16:56.454308", "2019-08-27 09:16:56.482433", "2019-08-27 09:16:56.761776",
"2019-08-27 09:16:57.305510" ,"2019-08-27 09:16:57.333628", "2019-08-27 09:16:57.612972"),
device=c("sdr_03", "sdr_02", "sdr_03", "sdr_02", "sdr_03" ,"sdr_04", "sdr_02", "sdr_04" ,"sdr_01", "sdr_02" ,"sdr_04",
"sdr_01"),
measurement=c(49.868820, 54.160831, 48.974476, 50.808674, 50.533058, 51.143322,57.447151,50.012745, 71.500305,56.851177,
60.390141, 73.470345),match_id=c(1,1,2,2,3,3,3,4,4,4,5,5) )
Я искал ответы в течение трех дней. Любая помощь очень ценится.
Решение dplyr Аллана Камерона приводит к идентификаторам совпадений, которые появляются позже в кадре данных - см. Строки 1,2,6,9. За один раз может быть записано менее 4 устройств, поэтому решения, которые всегда ожидают одинакового количества записывающих устройств для каждого измерения, не будут работать.
# A tibble: 12 x 4
# Groups: device [4]
timestamp device measurement new_id
<dttm> <fct> <dbl> <int>
1 2019-08-27 07:29:20.671313 sdr_03 49.9 1
2 2019-08-27 07:29:20.932043 sdr_02 54.2 1
3 2019-08-27 07:29:21.839312 sdr_03 49.0 2
4 2019-08-27 07:29:21.850454 sdr_02 50.8 2
5 2019-08-27 08:57:01.990833 sdr_03 50.5 3
6 2019-08-27 08:57:02.022798 sdr_04 51.1 1
7 2019-08-27 09:16:56.454308 sdr_02 57.4 3
8 2019-08-27 09:16:56.482433 sdr_04 50.0 2
9 2019-08-27 09:16:56.761775 sdr_01 71.5 1
10 2019-08-27 09:16:57.305510 sdr_02 56.9 4
11 2019-08-27 09:16:57.333627 sdr_04 60.4 3
12 2019-08-27 09:16:57.612972 sdr_01 73.5 2
В то время как решение Sotos дает больше последовательных идентификаторов совпадений, чем существуют уникальные устройства. Например, строки 5-9
# A tibble: 12 x 4
timestamp device measurement new_id
<chr> <fct> <dbl> <int>
1 2019-08-27 07:29:20 sdr_03 49.9 1
2 2019-08-27 07:29:20 sdr_02 54.2 1
3 2019-08-27 07:29:21 sdr_03 49.0 2
4 2019-08-27 07:29:21 sdr_02 50.8 2
5 2019-08-27 08:57:01 sdr_03 50.5 3
6 2019-08-27 08:57:02 sdr_04 51.1 3
7 2019-08-27 09:16:56 sdr_02 57.4 3
8 2019-08-27 09:16:56 sdr_04 50.0 3
9 2019-08-27 09:16:56 sdr_01 71.5 3
10 2019-08-27 09:16:57 sdr_02 56.9 4
11 2019-08-27 09:16:57 sdr_04 60.4 4
12 2019-08-27 09:16:57 sdr_01 73.5 4
Оба решения отлично работают (спасибо!), Если разница между измерениями составляет> 0,7 сек c или 4 устройства записаны одновременно. К сожалению, в большинстве случаев это не так. Я думаю, что решение, которое игнорирует временные метки и скорее проверяет дубликаты в последовательных строках, может быть лучше. Я нашел много решений для повторяющихся значений, используя rle () или data.table, но не нашел решения для определения последовательностей уникальных значений. Пожалуйста, помогите мне здесь!