使用 data.table 限制面板数据以删除主题

Constraint on panel data to remove subjects using data.table

我有一个面板数据集:

data <- data.table(ID = c(1,1,1,1,2,2,3,3,3),
                   year = c(1,2,3,4,1,2,1,2,3),
                   score1 = c(90,78,92,69,86,73,82,85,91))

> data
   ID year score1
1:  1    1     90
2:  1    2     78
3:  1    3     92
4:  1    4     69
5:  2    1     86
6:  2    2     73
7:  3    1     82
8:  3    2     85
9:  3    3     91

我想设置一个约束,使每个 ID 都应该有 至少 3 年 的观察。我尝试使用 data.table 包使用以下内容:

data[data$year >= 3, ]

然而,这忽略了 ID 的第 1 年和第 2 年的观察结果,这些观察结果至少有 3 年的观察结果。换句话说,我只想查看至少有 3 年观察结果的 ID,并且还包括第 1 年和第 2 年的观察结果。

因此预期的输出是:

   ID year score1
1:  1    1     90
2:  1    2     78
3:  1    3     92
4:  1    4     69
5:  3    1     82
6:  3    2     85
7:  3    3     91

我们可以使用分组方法

library(dplyr)
data %>%
    group_by(ID) %>% 
    filter(n_distinct(year) >= 3) %>%
    ungroup

-输出

# A tibble: 7 x 3
     ID  year score1
  <dbl> <dbl>  <dbl>
1     1     1     90
2     1     2     78
3     1     3     92
4     1     4     69
5     3     1     82
6     3     2     85
7     3     3     91

或使用data.table

library(data.table)
data <- setDT(data)[data[, .I[uniqueN(year) >=3], by = ID]$V1]

-输出

data
    ID year score1
1:  1    1     90
2:  1    2     78
3:  1    3     92
4:  1    4     69
5:  3    1     82
6:  3    2     85
7:  3    3     91

另一个data.table选项

> data[, .SD[uniqueN(year) >= 3], ID]
   ID year score1
1:  1    1     90
2:  1    2     78
3:  1    3     92
4:  1    4     69
5:  3    1     82
6:  3    2     85
7:  3    3     91