识别R

时间:2019-05-30 20:41:33

标签: r dplyr

我试图遍历数据帧并查找开始和停止对象之间的事件序列(在开始和结束处都发生的事件)。

以下是一些示例数据:

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管道中使用的东西,但欢迎任何成功的解决方案。

1 个答案:

答案 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