我想计算每2年和3年的公司总数,采样数据为:
# unbalanced data
library(data.table)
unbal <- data.frame(
firm=c(rep('dell',9),rep('hp',5),rep('ibm',5),rep('asus',7)),
year=c(2001,2001,2001,2003,2003,2003,2003,2004,2004,
2003,3003,2004,2004,2004,
2001,2002,2002,2002,2003,
2003,2004,2004,2004,2004,2005,2005)
)
我知道使用data.table(如
)计算每年总数的简便方法#repeated occurrence per year
test<-setDT(unbal)[, d12m:=.N, keyby=.(firm,year)]
但令我烦恼的是如何计算每2 [d24m]和3年[d36m]的总发生次数,因为数据涵盖了15年,手工逐年递归递增效率非常低。
*年不是连续的,例如,dell在2002年没有数据,因此d24 = d12在这个空白年的情况下。
事先提出任何建议。答案 0 :(得分:0)
好吧,我想我有你想要的东西。它可能不是最好的方法,但我认为你必须遵循类似的过程:
1)您的原始数据错过了多年。要获得连续的组,我们需要创建一个包含所有年份的数据框:
date_range<- data.frame(year=c(min(df$year):max(df$year))
(请注意,您的'unbal'数据框包含拼写错误 - 3003应更改为2003)
现在似乎也是指定这些年份的分组的好时机
date_range$twoyr<- rep(1:ceiling(nrow(date_range)/2),each=2)[1:nrow(date_range)]
date_range$threeyr<- rep(1:ceiling(nrow(date_range)/2),each=3)[1:nrow(date_range)]
(上面的代码只创建了分别重复每个级别两次和三次的序列.1:nrow(date_range)确保向量与我们附加的数据大小相同)
2)创建一个新的变量'weight',这将允许我们以unbal的形式添加实例 - 原因将变得清晰。
unbal$weight <- 1
3)创建一个笛卡尔积 - 公司和日期的所有组合如果你有一个大型数据集,这将需要一段时间,但这是我能想到的唯一方法来解决日期问题中的差距。
cartes<-merge(date_range,firms)
4)使用dplyr
group_by并汇总函数来计算“每两年”和“每三年”一组的数量。
merge(cartes,unbal,by=c("year","firm"),all.x=T) %>%
group_by(twoyr,firm) %>%
summarise(count=sum(weight)) %>% arrange(twoyr)
merge(cartes,unbal,by=c("year","firm"),all.x=T) %>%
group_by(threeyr,firm) %>%
summarise(count=sum(weight)) %>% arrange(threeyr)
变量'twoyr'和'threeyr'没有非常好的名字,但你应该能够进一步纠正这个问题。我也许会在以后改变。