2016-08-14 1 views
1

過去3年間(現在の年を含む)にイベント(航空会社別)が発生しているかどうかをチェックしたいと考えています。もしそうなら、私は1を返します。もしそうでなければ、私は0を返します。これはどうすればいいですか?私のデータは次のようになります。最後のx年のイベントを確認するダミーを返す

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)のようになります。テーブル::シフト(df $致命的、0:2、0L))関数として渡すと '' 'によって閉じられる可能性もあります。 –

+1

@ZheyuanLiここでrollapplyでどのように動作するかの例を教えてください。 – vio

答えて

1

私の元のコメント:

は、これは単なるローリング操作はありませんか?あなたは最高のローリングが欲しい。パッケージzooを使用し、rollapplyを試してください。ここで


例のデモンストレーションです。

#install.packages("zoo") 
library(zoo) 

まず、データがグループ化されていない基本的なケースを見てみましょう。あなたがここにpartial = TRUEalign = "right"をしたい、という

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 

注:おもちゃのベクトルを考えてみましょう。詳しくは?rollapplyの詳細セクションをご覧ください。便宜上、我々はラッパー関数定義(。また、それは我々がrollmaxを使用することはできませんpartial = TRUEの必要性のためであることに注意してください):特別なものは何もありません、グループ化されたデータについては

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 

次を比較し、?rollapplyalignの説明を理解していない:明らか

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を使用して、あなたのソリューションは次のようになります。

データ:

> 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 

各グループで最初の2年間のNAroll_sum(c(0,0, Fatal), 3)で置き換えた場合は、と置き換えてください。それに応じてrollNonFatal。

+0

このパッケージ "library(RcppRoll)"が見つかりません。何か案は? – vio

+0

最新の安定版は、ほとんどのパッケージと[Github](https://github.com/kevinushey/RcppRoll)のようにCRANで見つけられます。 – hvollmeier

関連する問題