2016-08-14 43 views
1

我想檢查一個事件(按航空公司分組)是否發生在過去3年(包括當前年份)。如果是這樣,我想要一個1返回。如果沒有,我想要返回0。我該怎麼做呢?我的數據是這樣的:檢查過去x年的事件返回dummy

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

這可能很簡單,我只是新的。我會盡力。謝謝! – vio

+0

如果'lag'可以接受一個向量,則可以使用dplyr輕鬆解決此問題。我想在GH的某處有一個FR。使用'data.table',就像'''Reduce('+',data。table :: shift(df $致命,0:2,0L))''''''''''''''''''如果你把它作爲一個函數傳遞給你也可以把它關閉 –

+1

@ZheyuanLi你可以舉一個例子說明它如何在rollapply中工作嗎? – vio

回答

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爲右對齊。)

2

使用dplyrRccpRoll,裏面有各種各樣的非常EFFIENT方式來實現窗口的功能您的解決方案可能是:

數據:

> 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 s在每個組的前兩年取代roll_sum(c(0,0, Fatal), 3)由。相應地爲rollNonFatal。

+0

我找不到「library(RcppRoll)」這個包。有任何想法嗎? – vio

+0

您可以在CRAN上找到最新的穩定版本,如大多數軟件包和[Github](https://github.com/kevinushey/RcppRoll)。 – hvollmeier