2

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

然而,并非所有公司都在这两年出现,我正在尝试创建一个平衡的长格式面板,其中只有那些在这两年出现的公司仍然存在。我该如何做到这一点?

这是说明问题的示例数据表:

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

在示例中,我需要一个代码/函数来排除 ID 为“2”的公司行,因为它在 2016 年没有匹配项。换句话说:我需要一个代码/函数,将每一行与如果 id 列中没有匹配项,则上一行和后续行并排除它。

我已经投入了很多时间,但似乎已经达到了我的 R 知识的极限,并且希望得到任何支持。谢谢!

4

3 回答 3

3

使用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
于 2019-04-11T17:02:39.690 回答
1

unique我们从整个数据集中创建一个“年份”向量,然后检查all“nm1”中的值是否是%in%按“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],但这是错误的,可能不适用于所有情况

于 2019-04-11T17:01:40.917 回答
0

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
于 2019-04-11T17:24:19.587 回答