我试图遍历数据帧并查找开始和停止对象之间的事件序列(在开始和结束处都发生的事件)。
以下是一些示例数据:
time = c('8:20', '8:19', '8:15', '8:14', '8:14', '8:10', '8:04', '8:03', '8:00', '7:59', '7:55', '7:44', '7:43','7:42')
action = c('A', 'B', 'C', 'B', 'F', 'T', 'Z', 'U', 'A', 'G', 'B', 'C', 'L', 'Z')
group = c('group1', 'group1', 'group1', 'group2', 'group1', 'group1', 'group2', 'group2','group2', 'group2', 'group2', 'group2', 'group1', 'group1')
test.df = cbind(time, action, group) %>% data.frame()
完整的数据集更长或更宽,但这足够了。
规则是,如果一个组(group1或group2)注册了操作“ A”而仅注册了“ A”,则它将开始运行顺序。在此之后,可能发生任何数量的事件,直到相反的组(如果group1启动了“ A”,则为group2;如果相反则为group 1)记录了动作“ Z”。相对基团的动作“ Z”表示序列的“终点”。
此过程在数据帧上迭代数百次。
每次该组中的一个开始执行操作“ A”时,我都希望将每个后续事件与一个ID值链接起来,该ID值在该组每次在数据帧上启动一个新序列时相加,直到执行“ Z”操作为止对面的一组。
IE,在上面的示例中,将有一个新列标识该序列所属的“ group1”,它是ID 1,而它们在数据集中稍后启动的下一个序列将是ID 2。用于第1组,等等
time action group group.sequence id
8:20 A group1 group1 1
8:19 B group1 group1 1
8:15 C group1 group1 1
8:14 B group2 group1 1
8:14 F group1 group1 1
[...]
这样一来,可以找到时间的总和,两次操作之间的操作次数,两次之间的操作类型。现在,可以忽略发生在组的“ A”到“ Z”动作之外的任何动作(例如,第8行)。
更喜欢我可以在dplyr管道中使用的东西,但欢迎任何成功的解决方案。
答案 0 :(得分:1)
这是我尝试使用tidyverse
的尝试。使用较大的dataframe
运行代码,并让我知道您的预期答案是否与我的不同。
library(tidyverse)
test.df %>%
mutate_if(is.factor, as.character) %>%
filter(action != "U") %>%
mutate(temp = ifelse(paste(group, action) %in%
c("group1 A", "group2 A", "group1 Z", "group2 Z"),
paste(group, action), NA),
group.sequence = ifelse(temp %in% c("group1 Z", "group2 Z"), NA, temp),
group.sequence = ifelse(!is.na(group.sequence), group, NA)) %>%
group_by(group.sequence) %>%
mutate(id = 1:n(),
id = ifelse(is.na(group.sequence), NA, id)) %>%
ungroup() %>%
fill(c(group.sequence, id)) %>%
select(-temp)
#> # A tibble: 13 x 5
#> time action group group.sequence id
#> <chr> <chr> <chr> <chr> <int>
#> 1 8:20 A group1 group1 1
#> 2 8:19 B group1 group1 1
#> 3 8:15 C group1 group1 1
#> 4 8:14 B group2 group1 1
#> 5 8:14 F group1 group1 1
#> 6 8:10 T group1 group1 1
#> 7 8:04 Z group2 group1 1
#> 8 8:00 A group2 group2 1
#> 9 7:59 G group2 group2 1
#> 10 7:55 B group2 group2 1
#> 11 7:44 C group2 group2 1
#> 12 7:43 L group1 group2 1
#> 13 7:42 Z group1 group2 1