R计算每2年和3年的公司发生率

时间:2017-06-02 15:35:30

标签: r count data.table

我想计算每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在这个空白年的情况下。

事先提出任何建议。

1 个答案:

答案 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'没有非常好的名字,但你应该能够进一步纠正这个问题。我也许会在以后改变。