R Назначить группу предыдущей или последовательной группе или удалить группу, в зависимости от шаблонов, найденных в группе до и после - PullRequest
0 голосов
/ 27 января 2020

У меня огромный временной ряд с измерениями различных устройств, сгруппированных по временным меткам. Из-за усреднения по времени отдельные измерения выпадают из групп, и их необходимо переназначить в правильную группу, просто изменив ее метку на метку времени остальной группы. Измерения, которые выпали, могут быть идентифицированы как группы, состоящие из одной строки. Правильная группа - это всегда группа до или после, но это зависит от характеристик групп. Есть в основном три случая. Случай 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, но пока ничего не работает. Любые предложения будут высоко оценены!

Ура, Яннис

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...