2016-08-27 1 views
0

내 :나는 현재 다음과 같은 데이터 프레임 함께 일하고 제거하지 최신 값을 각 요소 수준

CompanyID Share.ID share.2011 date.2011 share.2012 date.2012 
A   X   70.00  2011-07-01 
A   Y   70.00  2011-12-01 
A   Z        60.00  2012-12-01 
B   K   100.00  2011-09-01 
B   L        100.00  2012-12-01 
... 

CompanyID가 관찰 된 회사에 대한 식별자입니다. Share.ID은 회사의 대주주의 식별자입니다. date.20XX은 정보의 날짜를 의미합니다. share.20XX은 주주가 보유한 주식입니다.

내 문제는 다음과 같습니다. 이 데이터는 1 년 후에 주주가 2 명 이상일 경우 2011 년 A 사의 X, Y 등 대부분의 주주가 표시 될 수있는 방식으로 구성됩니다. 이는 잘못된 것입니다. 지금은 덜 현재의 데이터 포인트를 제거 할 수있는 방법을 찾아야합니다 (즉, date.2011 적은 전류 데이터 포인트), 그래서 :

Company.ID 수준 내에서

, share.2011, 말에 이주가있을 경우, 이전 데이터베이스에 입력 된 공유에 대한 ""으로 값을 덮어 (즉 date.2011에서 이전 날짜가 그)

다음과 같이 보일 것이다 마지막 표는 다음과 같습니다

CompanyID Share.ID share.2011 date.2011 share.2012 date.2012 
A   X      2011-07-01 
A   Y   70.00  2011-12-01 
A   Z        60.00  2012-12-01 
B   K   100.00  2011-09-01 
B   L        100.00  2012-12-01 
... 

가 감사를! 하위 집합과 관련된 몇 가지 옵션을 시도했지만 항상 실패했습니다.

답변

0

데이터가 긴 형식 인 경우 이와 같은 조작이 더 간단합니다. 긴 형식으로

library(dplyr) 

변환 데이터 :

dat.long = reshape(dat, varying=3:6, direction="long", timevar="year") 
 CompanyID Share.ID year share  date id 
1.2011   A  X 2011 70 2011-07-01 1 
2.2011   A  Y 2011 70 2011-12-01 2 
3.2011   A  Z 2011 NA  <NA> 3 
4.2011   B  K 2011 100 2011-09-01 4 
5.2011   B  L 2011 NA  <NA> 5 
1.2012   A  X 2012 NA  <NA> 1 
2.2012   A  Y 2012 NA  <NA> 2 
3.2012   A  Z 2012 60 2012-12-01 3 
4.2012   B  K 2012 NA  <NA> 4 
5.2012   B  L 2012 100 2012-12-01 5 

필터 각 year의 각 CompanyID 단지 대주주로 :

dat.long %>% 
    # Remove rows with no share data 
    filter(!is.na(share)) %>% 
    # Convert date to date format 
    mutate(date=as.Date(date)) %>% 
    # Operate by group 
    group_by(CompanyID, year) %>% 
    # Sort data 
    arrange(CompanyID, year, date) %>% 
    # Keep only the most recent date within each group 
    slice(n()) 
CompanyID Share.ID year share  date id 
1   A  Y 2011 70 2011-12-01  2 
2   A  Z 2012 60 2012-12-01  3 
3   B  K 2011 100 2011-09-01  4 
4   B  L 2012 100 2012-12-01  5 

위 예제에서, 나는 대다수 공유 홀더를 제외한 모든 행을 제거했습니다. 당신이 아닌 대다수 주주 행을 유지하지만 NA로 설정하면이 작업을 수행 할 수 있습니다

dat.long %>% 
    filter(!is.na(share)) %>% 
    mutate(date=as.Date(date)) %>% 
    group_by(CompanyID, year) %>% 
    arrange(CompanyID, year, date) %>% 
    mutate(share = ifelse(date==max(date), share, NA)) 
CompanyID Share.ID year share  date id 
1   A  X 2011 NA 2011-07-01  1 
2   A  Y 2011 70 2011-12-01  2 
3   A  Z 2012 60 2012-12-01  3 
4   B  K 2011 100 2011-09-01  4 
5   B  L 2012 100 2012-12-01  5 
+0

안녕을 eipi10 @ -이 매우 잘 작동, 대단히 감사합니다. 특히 '모양 변경'기능은 나에게 새로운 것이지만 매우 유용하게 보입니다! – deca

관련 문제