组合满足R中标准的行

时间:2017-06-19 22:07:01

标签: r loops if-statement cumsum

我有一个标准的数据框架,我有个人在一段时间内做某种行为。当事件发生在前一次事件的50秒内(延迟<= 50)时,我想将其与之前的事件结合起来。也就是说,每个事件都会有NA的延迟(第一次事故)或延迟> 50。然后,开始时间将是第一次事件的开始时间(NA或> 50),结束时间将是最后一次事件的结束时间&lt; = 50(参见下面的数据示例)。我还想在合并事件中加上X1的总和。希望下面的数据能够准确地说明我在寻找什么。

原始数据:

30

所需数据:

ID          Incident    Start   End     X1   Delay
Person A    1           747     748     735  NA
Person A    2           868     882     384  120
Person A    3           998     999     354  116
Person A    4           1057    1059    382  58
Person A    5           1063    1064    138  4
Person A    6           1077    1078    138  13
Person A    7           1412    1413    384  334
Person B    1           739     740     387  NA
Person B    2           742     743     132  2
Person B    3           760     761     386  17
Person B    4           768     769     731  7
Person B    5           835     835     894  66
Person B    6           838     839     891  3
Person B    7           925     926     385  86

我尝试过多个问题,问题是我不能通过ID聚合,因为同一个人可能有两个单独的事件。

谢谢!如果您需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

我认为你想要的结果表中有错误。第5行应该是人A.

这是使用dplyr执行此操作的方法。理由是我们首先使用cumsum组合indicents。如果延迟> 50或NA,事件数量增加1。然后,我们summarise在这个新的事件列上。

df%>%
  group_by(ID)%>%
  mutate(Incident=cumsum(Delay>50|is.na(Delay)))%>%
  group_by(ID,Incident)%>%
  summarise(Start=first(Start),End=last(End),X1=sum(X1),Delay=first(Delay))

       ID Incident Start   End    X1 Delay
    <chr>    <int> <int> <int> <int> <int>
1 PersonA        1   747   748   735    NA
2 PersonA        2   868   882   384   120
3 PersonA        3   998   999   354   116
4 PersonA        4  1057  1078   658    58
5 PersonA        5  1412  1413   384   334
6 PersonB        1   739   769  1636    NA
7 PersonB        2   835   839  1785    66
8 PersonB        3   925   926   385    86

数据

df <- read.table(text="ID  Incident  Start  End X1 Delay
PersonA    1           747     748     735  NA
PersonA    2           868     882     384  120
PersonA    3           998     999     354  116
PersonA    4           1057    1059    382  58
PersonA    5           1063    1064    138  4
PersonA    6           1077    1078    138  13
PersonA    7           1412    1413    384  334
PersonB    1           739     740     387  NA
PersonB    2           742     743     132  2
PersonB    3           760     761     386  17
PersonB    4           768     769     731  7
PersonB    5           835     835     894  66
PersonB    6           838     839     891  3
PersonB    7           925     926     385  86",header=TRUE,stringsAsFactors=FALSE)