У меня огромный временной ряд с измерениями различных устройств, сгруппированных по временным меткам. Из-за усреднения по времени отдельные измерения выпадают из групп, и их необходимо переназначить в правильную группу, просто изменив ее метку на метку времени остальной группы. Измерения, которые выпали, могут быть идентифицированы как группы, состоящие из одной строки. Правильная группа - это всегда группа до или после, но это зависит от характеристик групп. Есть в основном три случая. Случай 1) существует одинаковое количество измерений для каждого устройства в группе, за исключением устройства, которое также включает группу, которую необходимо переназначить (строки 1-5 и 6). Для этого устройства, по крайней мере, одно измерение отсутствует, и группа может быть назначена группе с отсутствующим измерением. Случай 2) следующая или предыдущая группа либо завершена (равное количество устройств-строк 7-12 и 13), либо отсутствующее устройство не входит в группу, которую мы рассматриваем (строки 13 и 14-16). В этом случае группа может быть удалена. I Случай 3) все устройства в предыдущей или следующей группе отличаются от устройства в неправильно назначенной группе. В этом случае он также может быть присвоен предыдущей или следующей группе.
Мои данные выглядят так
time device
1 2019-08-27 09:18:41 a
2 2019-08-27 09:18:41 b
3 2019-08-27 09:18:41 a
4 2019-08-27 09:18:41 c
5 2019-08-27 09:18:41 c
6 2019-08-27 09:18:42 b
7 2019-08-27 09:18:43 a
8 2019-08-27 09:18:43 a
9 2019-08-27 09:18:43 b
10 2019-08-27 09:18:43 b
11 2019-08-27 09:18:43 c
12 2019-08-27 09:18:43 c
13 2019-08-27 09:18:44 b
14 2019-08-27 09:18:45 a
15 2019-08-27 09:18:45 b
16 2019-08-27 09:18:45 b
17 2019-08-27 09:18:46 a
18 2019-08-27 09:18:46 b
19 2019-08-27 09:18:46 c
20 2019-08-27 09:18:47 d
Что может быть воспроизведено следующим образом:
my_df<-data.frame(time=rep(c("2019-08-27 09:18:41", "2019-08-27 09:18:42",
"2019-08-27 09:18:43", "2019-08-27 09:18:44",
"2019-08-27 09:18:45", "2019-08-27 09:18:46",
"2019-08-27 09:18:48"), c(5,1,6,1,3,3,1)),
device=c("a","b","a","c","c", "b", "a", "a", "b", "b",
"c", "c", "b", "a", "b", "b", "a", "b", "c", "d" ))
Это должно выглядеть так:
time device
1 2019-08-27 09:18:41 a
2 2019-08-27 09:18:41 b
3 2019-08-27 09:18:41 a
4 2019-08-27 09:18:41 c
5 2019-08-27 09:18:41 c
6 2019-08-27 09:18:41 b
7 2019-08-27 09:18:43 a
8 2019-08-27 09:18:43 a
9 2019-08-27 09:18:43 b
10 2019-08-27 09:18:43 b
11 2019-08-27 09:18:43 c
12 2019-08-27 09:18:43 c
13 2019-08-27 09:18:44 b
14 2019-08-27 09:18:45 a
15 2019-08-27 09:18:45 b
16 2019-08-27 09:18:45 b
17 2019-08-27 09:18:46 a
18 2019-08-27 09:18:46 b
19 2019-08-27 09:18:46 c
20 2019-08-27 09:18:46 d
Строка 6 была назначена предыдущей группе, так как ей не хватало одного измерения устройства b. Следующая группа завершена. Линия 13 не была назначена какой-либо группе, так как группа до завершения завершена, а в группе после отсутствует другое устройство. Линия 20 была назначена предыдущей группе, так как это устройство ранее не входило в предыдущую группу.
Желаемый результат может быть воспроизведен следующим образом:
my_reordered_df<-data.frame(time=rep(c("2019-08-27 09:18:41",
"2019-08-27 09:18:43","2019-08-27 09:18:44",
"2019-08-27 09:18:45", "2019-08-27 09:18:46"), c(6,6,1, 3,4)),
device=c("a","b","a","c","c", "b", "a", "a", "b", "b",
"c", "c","b","a", "b", "b", "a", "b", "c", "d" ))
Я боролся с трудоемким подходом расщепления и чрезмерно сложными операторами ifelse, но пока ничего не работает. Любые предложения будут высоко оценены!
Ура, Яннис