2017-09-19 42 views
2

我正在Stata中處理一些數據,在那裏我遇到了一個小問題。由於在Stata中沒有簡單的方法來解決它(我可以找到),所以我決定嘗試用我有限的R知識來解決它。我可怕地失敗了。子集取決於值在一個範圍內

我需要做的是保持觀察,其中(default_year - 1)是一年給出的範圍內,每個orgnr。換句話說:如果我有每年(年)的信息,直到它們的默認值(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

'''year amrrs

+0

對不起,在原始文章中輸入了錯字。我的意思是:(default_year - 1)。我需要在默認年份之前一年。 – Ibrpel

回答

2

隨着dplyr我們可以group_byorgnrfilter任何基團,其中default_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 

編輯

按照中如果default_year有0值,我們可以添加一個附加條件,以檢查問題的最新編輯。

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

謝謝你,那正是我正在尋找的。最後一個問題(供將來使用):假設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

灣保留所有行在default_year - 1 < year

對於這一點,你不需要subset()功能,只需使用索引:

一個。

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

b。

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

實施例:

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

對不起,不清楚。爲了讓它更加清楚,在我的問題中加了一點。你使用的代碼幾乎就是我正在尋找的。只有兩個問題(1)只要default_year - 1在年份範圍內,它就不應該放棄任何值;(2)由於某種原因,當我運行代碼時,它說有零行。 – Ibrpel

+0

對不起,我還是不太清楚。如果我理解正確,那麼代碼應該放棄'orgnr' 3和4的所有行,因爲3會丟失'year' 2006並且缺少4''year' 2003?你說'直到他們的默認',但從哪個起點?你能否將你的數據例子的預期輸出寫入你的問題,以便我能看到你想要結束的地方? – LAP

+1

你相信我是正確的。在我的問題中增加了預期輸出。對不起我的無能! – Ibrpel