2015-11-12 52 views
0

我通過採樣年類似下面有不同數量的不同數量的個體年齡的觀測重複截面數據的非平衡面板:R:平衡一個反覆交叉截面樣品

mydata <- data.frame(age = sample(60, 1000, replace=TRUE), 
       year=sample(3,1000, replace=TRUE), 
       x=rnorm(1000)) 

我想要平衡我的橫截面面板,以便每個橫截面具有相同數量的年齡。我想到了一些方法來做到這一點。我相信最簡單的方法就是統計每個年齡段的每個橫截面的人數。

mydata <- dplyr::mutate(group_by(mydata, age, year), nage=n()) 

然後我找到每個年齡組的最低計數。

mydata <- dplyr::mutate(group_by(mydata, age), minN=min(nage)) 

現在最後一部分是我不知道該怎麼做的部分。現在我想選擇每組中的第一個1:N觀察值。這樣做的顯而易見的方法是在每個組中創建一個索引變量。然後子集中的data.frame僅那些小於從1計數到N.

mydata <- dplyr::mutate(group_by(mydata, age, year), index=index()) 
subset(mydata, index <= minN) 

當然這是問題,即指標值觀測。功能index不存在。我已經寫出了這整個解釋,以便任何人都可以提供我正在尋找的功能,或者有人可以建議一種替代方法來實現這個相同的目標,或兩者兼而有之。感謝您的考慮!

回答

2

舊的解決方案:

mydata %>% group_by(age, year) %>% 
    mutate(nage=n()) %>% 
    group_by(age) %>% 
    filter(row_number()%in%1:min(nage)) 

最終的解決方案:

mydata %>% 
    group_by(age, year) %>% 
    mutate(nage=n()) %>% 
    group_by(age) %>% 
    mutate(minN = min(nage)) %>% 
    group_by(age, year) %>% 
    slice(seq_len(minN[1L])) 
+1

不要以爲它的工作原理,因爲過濾器無差別地跨年搶奪意見。我修改了你的第一個提交來完成這項工作。 'MYDATA%>% GROUP_BY(年齡,年)%>% 突變(NAGE = N())%>% GROUP_BY(年齡)%>% 突變(明尼蘇達州=分鐘(NAGE))%>% GROUP_BY (年齡,年份)%>% 切片(seq_len(minN [1L]))' – fsmart