想象以下数据框的片段:
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 ,而不是只对连续两次出现相同事件的人进行比较。
任何有关实现此目标的想法将受到高度赞赏。
答案 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