我想检查过去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
这是关于航空公司的崩溃。
答案 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 = TRUE
和align = "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
进行正确对齐。)