消除每个因素级别内的最新值

时间:2016-08-27 22:41:10

标签: r

我目前正在使用类似于以下内容的数据框:

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是股东持有的股份。

我现在的问题如下。数据的结构是在一年内,2个或更多股东可以出现多数股票(例如2011年公司A的X,Y),这是错误的。我现在需要找到一种方法来消除当前较少的数据点(即具有较小电流date.2011的数据点),以便:

在每个Company.ID级别内,如果有2个共享,例如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
...

谢谢!我尝试了几个涉及子集的选项,但到目前为止总是失败。

1 个答案:

答案 0 :(得分: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

过滤到每个CompanyID中每个year的大多数股东:

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