检查最近x年返回假人的事件

时间:2016-08-14 11:12:46

标签: 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       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

这是关于航空公司的崩溃。

2 个答案:

答案 0 :(得分:2)

使用RepositoryDependencyResolver.SetDependencyResolver(new AutofacDependencyResolver(container)); dplyr,其中包含以非常有效的方式实现的各种窗口函数,您的解决方案可能是:

您的数据:

RccpRoll

如果您希望每组的前2年> 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 次,请NA替换roll_sum(c(0,0, Fatal), 3)。对于rollNonFatal。

答案 1 :(得分:1)

我对你的问题的原始评论:

  

这不仅仅是一次滚动操作吗?你想要滚动最大化。使用包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

请注意,您需要partial = TRUEalign = "right"。有关详细信息,请参阅?rollapply中的详细信息部分。 (另请注意,需要partial = TRUE,我们不能使用rollmax。)为方便起见,我们定义了一个包装函数:

last3 <- function (u) rollapply(u, max, width = 3, partial = TRUE, align = "right")

对于分组数据,没有什么特别之处,但按群组应用rollapply,我们使用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?rollapply的说明,请比较以下内容:

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

显然align = "right"是你希望的行为。 (只是另一条评论,您可以使用rollapplyr进行正确对齐。)