R 检查过去x年中的事件

R 检查过去x年中的事件,r,dplyr,R,Dplyr,我想检查过去3年(包括本年度)是否发生事件(按航空公司分组)。如果是的话,我要退回1。如果没有,我希望返回0。我该怎么做?我的数据如下所示: Airline Year Fatal Non_Fatal French_Airline 1989 0 1 French_Airline 1990 1 0 French_Airline 1991 0 0 French_Airline 1992 0

我想检查过去3年(包括本年度)是否发生事件(按航空公司分组)。如果是的话,我要退回1。如果没有,我希望返回0。我该怎么做?我的数据如下所示:

Airline          Year  Fatal  Non_Fatal
French_Airline   1989    0       1 
French_Airline   1990    1       0 
French_Airline   1991    0       0
French_Airline   1992    0       1
French_Airline   1993    0       0
UK_Airline       1989    1       1
UK_Airline       1990    0       0
UK_Airline       1991    1       0
UK_Airline       1992    0       0
UK_Airline       1993    0       0
理想情况下,我的输出应该是这样的

Airline          Year  Fatal  Non_Fatal Last_3_Fatal Last_3_NonFatal
French_Airline   1989    0       1            0            1
French_Airline   1990    1       0            1            1
French_Airline   1991    0       0            1            1
French_Airline   1992    0       1            1            1 
French_Airline   1993    0       0            0            1
UK_Airline       1989    1       1            1            1
UK_Airline       1990    0       0            1            1
UK_Airline       1991    1       0            1            1
UK_Airline       1992    0       0            1            0 
UK_Airline       1993    0       0            1            0

这是关于飞机坠毁的

我对你的问题的最初评论:

这不只是一个滚动操作吗?你想要滚动到最大。使用package
zoo
,然后尝试
rollapply


下面是一个示例演示

#install.packages("zoo")
library(zoo)
我们首先看一看基本情况,其中数据没有分组。考虑玩具矢量:

set.seed(0);x <- sample(0:1,10,TRUE)
# [1] 1 0 0 1 1 0 1 1 1 1
rollapply(x, max, width = 3, partial = TRUE, align = "right")
# [1] 1 1 1 1 1 1 1 1 1 1
对于分组数据,除了按组应用
rollply
,没有什么特别的,我们使用
tapply
函数

## a data frame: two groups `a` and `b`, each with 10 data
set.seed(0)
dat <- data.frame(group = gl(2, 10, labels = letters[1:2]),
                  x = sample(0:1, 20, TRUE))

## apply `last3` to `x` by `group`, and append result to `dat`
dat$last3 <- unlist(with(dat, tapply(x, group, FUN = last3)), use.names = FALSE)
#   group x last3
#1      a 1     1
#2      a 0     1
#3      a 0     1
#4      a 1     1
#5      a 1     1
#6      a 0     1
#7      a 1     1
#8      a 1     1
#9      a 1     1
#10     a 1     1
#11     b 0     0
#12     b 0     0
#13     b 0     0
#14     b 1     1
#15     b 0     1
#16     b 1     1
#17     b 0     1
#18     b 1     1
#19     b 1     1
#20     b 0     1

显然,
align=“right”
是您希望的行为。(只是另一个注释,您可以使用
rollappyr
进行右对齐。)

使用
dplyr
RccpRoll
,它们以非常有效的方式实现了各种窗口功能,您的解决方案可能是:

您的数据:

> crashes
          Airline Year Fatal Non_Fatal
1  French_Airline 1989     0         1
2  French_Airline 1990     1         0
3  French_Airline 1991     0         0
4  French_Airline 1992     0         1
5  French_Airline 1993     0         0
6      UK_Airline 1989     1         1
7      UK_Airline 1990     0         0
8      UK_Airline 1991     1         0
9      UK_Airline 1992     0         0
10     UK_Airline 1993     0         0

library(dplyr)
library(RcppRoll)
crashes %>% group_by(Airline) %>% 
  mutate(rollFatal=roll_sum(c(0,0, Fatal), 3),rollNonFatal=roll_sum(c(0,0, Non_Fatal), 3))

Source: local data frame [10 x 6]
Groups: Airline [2]

          Airline  Year Fatal Non_Fatal rollFatal rollNonFatal
            <chr> <int> <int>     <int>     <dbl>        <dbl>
1  French_Airline  1989     0         1         0            1
2  French_Airline  1990     1         0         1            1
3  French_Airline  1991     0         0         1            1
4  French_Airline  1992     0         1         1            1
5  French_Airline  1993     0         0         0            1
6      UK_Airline  1989     1         1         1            1
7      UK_Airline  1990     0         0         1            1
8      UK_Airline  1991     1         0         2            1
9      UK_Airline  1992     0         0         1            0
10     UK_Airline  1993     0         0         1            0
>崩溃
航空公司年度致命非致命
1法国航空公司1989 0 1
2法航1990 1 0
3法航1991 0 0
4法航1992 01
5法国航空公司1993 0 0
6英国航空公司1989 1
7英国航空公司1990 0 0
8英国航空公司1991年1月10日
9英国航空公司1992 0 0
10英国航空公司1993 0 0
图书馆(dplyr)
图书馆(RcppRoll)
交通事故%>%按(航空公司)分组%>%
突变(rollFatal=Rollu和(c(0,0,致命),3),rollNonFatal=Rollu和(c(0,0,非致命),3))
来源:本地数据帧[10 x 6]
组别:航空公司[2]
航空公司年度致命非致命Roll致命非致命Roll
1法国航空公司1989 01 01
2法航1990 1 0 1 1
3法航1991 0 1 1
4法国航空公司1992 01
5法航1993 01
6英国航空公司1989 1
7英国航空公司1990 01
8英国航空公司1991 1 0 2 1
9英国航空公司1992 01 0
10英国航空公司1993 01 0

如果您希望各组在前2年使用
NA
s替换
roll\u sum(c(0,0,致命),3)
roll\u sum(c(rep(NA,2,致命),3)
。这可能很简单,我只是个新手。我试试看。谢谢如果
lag
可以接受向量,那么可以使用dplyr轻松解决这个问题。我想在GH的某个地方有个FR。使用
data.table
,类似于
Reduce(`+`,data.table::shift(df$Fatal,0:2,0L))
的东西也可以使您接近,如果您将其作为function@ZheyuanLi你能在这里举个例子说明它是如何与rollapply一起工作的吗?我找不到这个包的“library(RcppRoll)”。有什么想法吗?你可以在CRAN找到最新的稳定版本,就像大多数软件包一样。
x <- 1:10
rollapply(x, max, width = 3, partial = TRUE, align = "left")
# [1]  3  4  5  6  7  8  9 10 10 10
rollapply(x, max, width = 3, partial = TRUE, align = "center")
# [1]  2  3  4  5  6  7  8  9 10 10
rollapply(x, max, width = 3, partial = TRUE, align = "right")
# [1]  1  2  3  4  5  6  7  8  9 10
> crashes
          Airline Year Fatal Non_Fatal
1  French_Airline 1989     0         1
2  French_Airline 1990     1         0
3  French_Airline 1991     0         0
4  French_Airline 1992     0         1
5  French_Airline 1993     0         0
6      UK_Airline 1989     1         1
7      UK_Airline 1990     0         0
8      UK_Airline 1991     1         0
9      UK_Airline 1992     0         0
10     UK_Airline 1993     0         0

library(dplyr)
library(RcppRoll)
crashes %>% group_by(Airline) %>% 
  mutate(rollFatal=roll_sum(c(0,0, Fatal), 3),rollNonFatal=roll_sum(c(0,0, Non_Fatal), 3))

Source: local data frame [10 x 6]
Groups: Airline [2]

          Airline  Year Fatal Non_Fatal rollFatal rollNonFatal
            <chr> <int> <int>     <int>     <dbl>        <dbl>
1  French_Airline  1989     0         1         0            1
2  French_Airline  1990     1         0         1            1
3  French_Airline  1991     0         0         1            1
4  French_Airline  1992     0         1         1            1
5  French_Airline  1993     0         0         0            1
6      UK_Airline  1989     1         1         1            1
7      UK_Airline  1990     0         0         1            1
8      UK_Airline  1991     1         0         2            1
9      UK_Airline  1992     0         0         1            0
10     UK_Airline  1993     0         0         1            0