我目前正在使用类似于以下内容的数据框:
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
...
谢谢!我尝试了几个涉及子集的选项,但到目前为止总是失败。
答案 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