2017-06-02 83 views
0

我想每2年和3年統計公司總數公司的[R計數事件,採樣數據是:每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年裏將是非常低效的遞歸增加年復一年地手工。 *年份不是連續的,例如,戴爾在2002年沒有數據,所以d24 = d12在這個年份的情況下。

thx對於任何建議提前。

+0

我不確定我是否理解這個問題。你想要統計2001-2002,2002-2003,2003-2004等各個範圍內的觀測數量嗎? – Chris

+0

對,我想統計每個範圍內(每兩年2001-2002 ...和每三年2001-2003 ...)的obs(公司)數量。 – changjx

+0

您應該顯示與此示例相對應的所需輸出。 – Frank

回答

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$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'沒有很好的名字,但你應該能夠糾正這個問題。也許以後我會改變的。