2017-09-19 2 views
2

작은 문제가 발생한 Stata의 일부 데이터로 작업하고있었습니다. Stata에서 그것을 해결할 수있는 간단한 방법이 없었기 때문에 제한된 R 지식으로 해결하려고했습니다. 나는 끔찍하게 실패했다.부분 집합의 값이 범위 내에 있음

내가해야 할 일은 각 orgnr에 대해 (default_year - 1)이 (가) 주어진 범위 내에 있는지 관찰하는 것입니다. 다른 말로하면 : 나는 매년 (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 

을 편집 상담자 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

또는

B를 유지합니다. 모든 행을 유지하려면 default_year - 1 < year.

A :

이 들어, 그냥 사용, 색인을 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

불명확해서 죄송합니다. 더 명확하게하기 위해 내 질문에 조금을 추가했습니다. 당신이 사용한 코드는 제가 찾고 있던 거의 것입니다. 단지 두 가지 문제 (1) default_year - 1이 연도 범위 내에있는 한 모든 값을 삭제해서는 안되며 (2) 코드를 실행할 때 어떤 이유로 0 행이 있다고 말합니다. – Ibrpel

+0

죄송합니다, 아직 나에게 명확하지 않습니다. 그것이 올바르게 이해된다면, 코드는 'orgnr' 3과 4에 대한 모든 행을 삭제해야합니다. 왜냐하면 3은 2006 년이 빠졌고 4는 2003 년이 누락 되었기 때문입니다. 당신은'채무 불이행까지 '라고 말하지만 출발점은 무엇입니까? 데이터 예제의 예상 출력을 직접 작성하여 궁금한 점이 있습니까? 결국 원하는 결과를 볼 수 있습니까? – LAP

+1

나는 그것이 틀림 없음을 당신이 정확하게 이해하고 있습니다. 내 질문에 예상 출력을 추가했습니다. 내 무능을 유감스럽게 생각합니다! – Ibrpel

관련 문제