根据重复的连续行条目创建新列

时间:2020-02-20 14:05:55

标签: r pivot tidy dtplyr

想象以下数据框的片段:

       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 中的重复条目创建两个新列。

具体来说,我想将同一活动的两个后续行合并为具有开始和完整时间戳记的一行(以秒为单位,来自Time)。

鉴于并非 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 中的所有类别在该列中多次出现。我希望不要比较整个列中的关联 Time ,而不是只对连续两次出现相同事件的人进行比较。

任何有关实现此目标的想法将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

像这样吗?

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

答案 1 :(得分:0)

在本地比较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

示例:https://stackoverflow.com/a/43127176/10276092