如何从 R 中的面板数据框中删除具有唯一 ID 的行?

How to delete rows with a unique ID from a panel data frame in R?

我有一个数据 table 包含数千家可以通过唯一 ID 识别的公司。它是长格式数据,每个公司应该在不同年份出现两次(两年内的横截面时间序列)。

但是,并非所有公司都出现在这两年中,我正在尝试创建一个平衡的长格式面板,其中只保留出现在这两年中的公司。我该如何实现?

这是一个示例数据 table 来说明问题:

example <- matrix(c(1,1,2,3,3,2013,2016,2013,2013,2016), ncol=2)
colnames(example) <- c('id', 'year')
example.table <- data.table(example)
example.table

   id year
1:  1 2013
2:  1 2016
3:  2 2013
4:  3 2013
5:  3 2016

在示例中,我需要一个 code/function 来排除 ID 为“2”的公司行,因为它在 2016 年没有匹配项。 换句话说:我需要一个 code/function 将每一行与前一行和后一行进行比较并排除它,如果在 id 列中没有匹配项。

我已经投入了很多时间,但似乎已经达到了我的 R 知识的极限,非常感谢任何支持。谢谢!

我们从整个数据集创建一个 unique 'year' 的向量,然后检查 all 'nm1' 中的值是否 %in% 'year' 按 'id' 分组并子集 data.table

un1 <- unique(example.table$year)
example.table[, .SD[all(un1 %in% year)], id]
#   id year
#1:  1 2013
#2:  1 2016
#3:  3 2013
#4:  3 2016

注意:OP的数据集是data.table,这里使用的方法是data.table。最初,考虑过使用 .SD[uniqueN(year) > 1],但这是错误的,可能不适用于所有情况

使用 dplyr 如下:

library(dplyr)
example.table %>%
  group_by(id) %>%
  filter(n() > 1)
# A tibble: 4 x 2
# Groups:   id [2]
     id  year
  <dbl> <dbl>
1     1  2013
2     1  2016
3     3  2013
4     3  2016

data.table 等效于@Sonny 的dplyr 解决方案

example.table[, if(.N > 1) .SD, id]

   id year
1:  1 2013
2:  1 2016
3:  3 2013
4:  3 2016