0

想象一下以下数据框的片段:

       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中的所有条目都有匹配的第二个条目(但是,最多两个连续条目是相同的),我还想删除这样的行,在这种情况下为延迟。

然后它应该看起来像:

       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中的所有类别在该列中出现多次。我希望不要比较它们的关联时间,而不是跨越整个列,只比较那些有两个连续相同出现的时间。

任何关于如何解决这个问题的想法都将受到高度赞赏。

4

2 回答 2

0

在本地比较活动名称组。创建一个新字段作为分组依据,用于标识本地组何时更改。

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

于 2020-02-21T14:26:17.763 回答
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
于 2020-02-20T14:35:47.313 回答