Создание нового столбца на основе повторяющихся последовательных записей строк - PullRequest
0 голосов
/ 20 февраля 2020

Представьте себе фрагмент следующего фрейма данных:

       ID        ActivityName     Time         Type    Shape 
1       1             Request    0.000       Type_1      767           
2       1             Request  600.000       Type_1      767           
3       1               Start  600.000       Type_1     1376           
4       1               Start  600.000       Type_1     1376  
5       1               Delay 2962.295       Type_1     1022         
6       1 Schedule Activities  600.000       Type_1       15           
7       1 Schedule Activities 2062.295       Type_1       15  

Я пытаюсь создать два новых столбца на основе повторяющихся записей в ActivityName .

В частности, я хочу объединить две последующие строки для одного и того же действия в одну строку с начальной и полной отметкой времени (от времени в секундах).

Учитывая, что не все записи в ActivityName имеют совпадающую вторую запись (однако, максимум две последовательные записи идентичны), я также хотел бы удалить такие строки, как Delay в данном случае.

Затем он должен выглядеть примерно так:

       ID        ActivityName  StartTime   EndTime      Type    Shape 
1       1             Request  0.000       600.000      Type_1  767           
2       1               Start  600.000     600.000      Type_1  1375
3       1 Schedule Activities  600.000     2062.295     Type_1  15

Все категории в ActivityName встречаются много раз в этом столбце. Я надеюсь не сравнивать их Время не по всей колонке, а только тех, у кого есть два идентичных события подряд.

Любые идеи о том, как go об этом, будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Сравнение групп Activity_name локально. Создание нового поля для группировки, которое определяет, когда изменяется локальная группа.

df<-data.frame(activity_name = c("A", "A", "B", "B", "C", "C", "A"),
               time = c(0,2,2,4,4,6,99))
  activity_name time
1             A    0
2             A    2
3             B    2
4             B    4
5             C    4
6             C    6
7             A   99
library(tidyverse)

df %>% 
  mutate(groupChanged = (activity_name != lag(activity_name, default = activity_name[1])),
         toCutBy = cumsum(groupChanged)) %>% 
  group_by(toCutBy) %>%
  summarise(activity_name = first(activity_name),
            StartTime = first(time),
            EndTime = last(time))
  toCutBy activity_name StartTime EndTime
1       0 A                     0       2
2       1 B                     2       4
3       2 C                     4       6
4       3 A                    99      99

Пример: { ссылка }

0 голосов
/ 20 февраля 2020

Как то так?

df<-data.frame(activity_name = c("A", "A", "B", "B", "C", "C"),
               time = c(0,2,2,4,4,6))
df
  activity_name time
1             A    0
2             A    2
3             B    2
4             B    4
5             C    4
6             C    6
library(tidyverse)
df %>% 
  group_by(activity_name) %>% 
  summarise(StartTime = first(time),
            EndTime = last(time))
  activity_name StartTime EndTime
  <fct>             <dbl>   <dbl>
1 A                     0       2
2 B                     2       4
3 C                     4       6
...