2017-09-19 11 views
2

小さな問題が発生したStataのデータで作業していました。私が見つけることができるStataでそれを解決する簡単な方法がなかったので、私は限られたR知識でそれを解決しようと決めました。私はひどく失敗しました。サブセットの値が範囲内にあるかどうか

私がする必要があるのは、各orgnrに対して、(default_year - 1)がyearで指定された範囲内にあるという観測を維持することです。言い換えれば:毎年(年)毎にデフォルト(default_year)までの情報を持っていれば、組織(orgnr)を維持したいだけです。デフォルトの後に情報があるかどうかは関係ありません。

このコードはどのようにRで表示されますか?

サブセット関数といくつかの論理演算子を使用しようとしましたが、動作できませんでした。

事前に感謝!

orgnr year default_year income 
1  2000 2004   100 
1  2001 2004   105 
1  2002 2004   95 
1  2003 2004   75 
2  2004 2006   14 
2  2005 2006   10 
2  2003 2006   6 
3  1999 2007   54 
3  2000 2007   59 
3  1998 2007   50 
3  2001 2007   64 
3  2002 2007   60 
3  2003 2007   51 
3  2004 2007   45 
3  2005 2007   40 
4  2010 2004   5 
4  2011 2004   7 
5  1999 2000   50 
5  1998 2000   45 
5  2000 2000   55 
5  2001 2000   49 
5  2002 2000   51 
6  2009 0    10 
6  2010 0    12 

予想される出力:

orgnr year default_year income 
    1  2000 2004   100 
    1  2001 2004   105 
    1  2002 2004   95 
    1  2003 2004   75 
    2  2004 2006   14 
    2  2005 2006   10 
    2  2003 2006   6 
    5  1999 2000   50 
    5  1998 2000   45 
    5  2000 2000   55 
    5  2001 2000   49 
    5  2002 2000   51 
    6  2009 0    10 
    6  2010 0    12 
+0

'' ' amrrs

+0

申し訳ありませんが、元の投稿にタイプミスがありました。私は意味した:(default_year - 1)。私は、デフォルト年の前に年を取る必要があります。 – Ibrpel

答えて

2

我々はできるgroup_byorgnrfilterdefault_yearが範囲内である任意の基。

library(dplyr) 
df %>% 
    group_by(orgnr) %>% 
    filter(any(max(year) >= (default_year-1) & min(year) <= (default_year -1))) 


# orgnr year default_year income 
# <int> <int>  <int> <int> 
# 1  1 2000   2004 100 
# 2  1 2001   2004 105 
# 3  1 2002   2004  95 
# 4  1 2003   2004  75 
# 5  2 2004   2006  14 
# 6  2 2005   2006  10 
# 7  2 2003   2006  6 
# 8  5 1999   2000  50 
# 9  5 1998   2000  45 
#10  5 2000   2000  55 
#11  5 2001   2000  49 
#12  5 2002   2000  51 

EDIT質問default_yearは0の値を持つならば、我々はそれをチェックするために条件を追加することができ、最新の編集を1として

df %>% 
    group_by(orgnr) %>% 
    filter(all(default_year == 0) | any(max(year) >= (default_year-1) 
      & min(year) <= (default_year -1))) 


# orgnr year default_year income 
# <int> <int>  <int> <int> 
# 1  1 2000   2004 100 
# 2  1 2001   2004 105 
# 3  1 2002   2004  95 
# 4  1 2003   2004  75 
# 5  2 2004   2006  14 
# 6  2 2005   2006  10 
# 7  2 2003   2006  6 
# 8  5 1999   2000  50 
# 9  5 1998   2000  45 
#10  5 2000   2000  55 
#11  5 2001   2000  49 
#12  5 2002   2000  51 
#13  6 2009   0  10 
#14  6 2010   0  12 
+0

ありがとう、それは私が探していたものです。最後の1つの質問(将来の使用のため):default_yearの値が0であるとします。値が0の場合、観測値を保持することを追加できます。 – Ibrpel

+0

@IbrahimPelja申し訳ありませんが、あなたの質問はありませんでした。 –

+0

組織がデフォルト設定していない場合、default_yearの値は0になります。これは、明らかに年の値と一致しません(年は1998〜2015年のデータセットのみです)。 default_year = 0の場合に組織を削除しないようにコードを書き直すことはできますか? – Ibrpel

0

only keep observations where the (default_year - 1) for each orgnr is within the range given by year.これは私には本当に明確ではありません。

私はどちらかと思っています。

a。すべての行default_year - 1 > year

または

Bを維持します。すべての行を保持する場所はdefault_year - 1 < yearです。

はこのために、あなただけの使用、インデックスをsubset()機能を必要としません。

df2 <- df[df$default_year - 1 > df$year,] 

b。

df2 <- df[df$default_year - 1 < df$year,] 

例:dplyr

df <- read.table(text = "orgnr year default_year 
1  2000 2004 
1  2001 2004 
1  2002 2004 
1  2003 2004 
2  2004 2006 
2  2005 2006 
2  2003 2006 
3  1999 2007 
3  2000 2007 
3  1998 2007 
3  2001 2007 
3  2002 2007 
3  2003 2007 
3  2004 2007 
3  2005 2007 
4  2010 2004 
4  2011 2004 
5  1999 2000 
5  1998 2000 
5  2000 2000 
5  2001 2000 
5  2002 2000", header = TRUE) 

df2 <- df[df$default_year - 1 > df$year,] 

> df2 
    orgnr year default_year 
1  1 2000   2004 
2  1 2001   2004 
3  1 2002   2004 
5  2 2004   2006 
7  2 2003   2006 
8  3 1999   2007 
9  3 2000   2007 
10  3 1998   2007 
11  3 2001   2007 
12  3 2002   2007 
13  3 2003   2007 
14  3 2004   2007 
15  3 2005   2007 
19  5 1998   2000 

df2 <- df[df$default_year - 1 < df$year,] 

> df2 
    orgnr year default_year 
16  4 2010   2004 
17  4 2011   2004 
20  5 2000   2000 
21  5 2001   2000 
22  5 2002   2000 
+0

不明な点をおかけして申し訳ありません。私の質問にビットを追加して、それをもっと明確にしようとしました。あなたが使ったコードは、私が探していたものです。 2つの問題(1)は、default_year - 1が年の範囲内にある限り、すべての値を削除すべきではありません。(2)コードを実行する何らかの理由で、ゼロ行があると言います。 – Ibrpel

+0

申し訳ありませんが、それはまだ私には明確ではありません。私がそれを正しく理解すれば、 'orgnr' 3と4のすべての行が削除されるはずです。なぜなら、3年は2006年がなくなり、4年は2003年が欠落しているからです。あなたは「デフォルトになるまで」と言っていますが、どこから出発点ですか?あなたの質問にあなたのデータ例の期待される出力を手で書くことができますか?それで、あなたはどこに行きたいのか分かりますか? – LAP

+1

私はそれが正しいと理解しています。私の質問に予想される出力を追加しました。私の無能なため申し訳ありません! – Ibrpel

関連する問題