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