R:平衡重复的横截面样本

时间:2015-11-12 17:51:05

标签: r dplyr

我有一个不平衡的重复横截面数据小组,不同的观察数量和不同年龄的个体通过抽样年份如下:

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不存在。我已经写出了这整个解释,以便有人可以提供我正在寻找的功能,或者有人可以建议一种替代方法来实现同一目标,或两者兼而有之。谢谢你的考虑!

1 个答案:

答案 0 :(得分: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]))