首页 > 解决方案 > R中类别内的子集条件

问题描述

我正在使用一个调查数据集 (ESS),每波包括几个国家,每波中有几个人。它看起来像这样:

国家 海浪
1
1
1
2
3
3
4
4
5
6
7
8
9
9
1
2
2
3
4
5
6
7
7
9
9

我想过滤/子集数据以获得一个新的干净数据框,该数据框仅包含所有波浪中包含的国家,范围从 1 到 9。换句话说,我需要根据条件选择国家他们在所有 9 个波中都有观察。在上面的例子中,只有“AT”会被选择,因为“BE”缺少第 8 波。

这听起来很简单,但我正在努力寻找一种简单的方法来解决它(可能是因为我是 R 新手)。

非常感谢您的帮助。

标签: rif-statementsubset

解决方案


您可以在 中选择1 到 9 的Country值。allWave

library(dplyr)
df1 <- df %>% group_by(Country) %>% filter(all(1:9 %in% Wave)) %>% ungroup
df1

#   Country  Wave
#   <chr>   <int>
# 1 AT          1
# 2 AT          1
# 3 AT          1
# 4 AT          2
# 5 AT          3
# 6 AT          3
# 7 AT          4
# 8 AT          4
# 9 AT          5
#10 AT          6
#11 AT          7
#12 AT          8
#13 AT          9
#14 AT          9

这也可以用基础 R 和data.table-

#Base R
df1 <- subset(df, as.logical(ave(Wave, Country, 
              FUN = function(x) all(1:9 %in% x))))

#data.table
library(data.table)
setDT(df)[, .SD[all(1:9 %in% Wave)], Country]

推荐阅读