我有一个不平衡的重复横截面数据小组,不同的观察数量和不同年龄的个体通过抽样年份如下:
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
不存在。我已经写出了这整个解释,以便有人可以提供我正在寻找的功能,或者有人可以建议一种替代方法来实现同一目标,或两者兼而有之。谢谢你的考虑!
答案 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]))