面板数据:如何删除缺少年度信息的 ID

panel data: How to remove IDs with missing yearly information

我有一个包含 Id-year 观测值的数据集。我想比较之前和 after/in 2015 之前的变化。因此我需要所有公司在之前和 after/in 2015 之前进行观察,以便我可以进行比较。

ID year diesese
1 2012  3
1 2016  4
3 2013  3
3 2015  4
2 2012  3
2 2013  4

我的问题是如何删除仅在2015年之前或2015年之后观察的公司?所以在上面的数据中,只有 ID=1 和 ID=3 符合我的需要,ID=2 不符合我的需要。

一个想法是将 ave 与一个函数一起使用,该函数计算大于或等于 2015 的值的数量。!! 将其转换为逻辑,以便我们可以索引,即

df[!!with(df, ave(year, ID, FUN = function(i)length(i[i >= 2015]) >= 1)),]

这给出了,

ID year disease
1  1 2012       3
2  1 2016       4
3  3 2013       3
4  3 2015       4

@RonakShah 和@Jaap 的几个选项,

df[!with(df, ave(year, ID, FUN = function(x) all(x > 2015) | all(x < 2015)))), ]
df[with(df, ave(year, ID, FUN = function(y) any(y >= 2015))),]

tidyverse:

df%>%
   mutate_all(as.numeric)%>%
   group_by(ID)%>%
   filter(ID %in% ID[any(year>=2015) & any(year<2015)])
# A tibble: 4 x 3
# Groups:   ID [2]
     ID  year diesese
  <dbl> <dbl>   <dbl>
1    1. 2012.      3.
2    1. 2016.      4.
3    3. 2013.      3.
4    3. 2015.      4.

或者这个

df%>%
  mutate_all(as.numeric)%>%
  group_by(ID)%>%
  filter(!ID %in% ID[all(year>2015) | all(year<2015)])

这是另一种选择。我们循环遍历每个 ID 中的数据,并过滤任何没有任何 2015 年或之后数据的组。

library(tidyverse)

df %>%
  nest(-ID) %>%
  filter(map_dbl(data, ~length(which(.x$year >= 2015))) > 0) %>%
  unnest
#> # A tibble: 4 x 3
#>      ID  year diesese
#>   <int> <int>   <int>
#> 1     1  2012       3
#> 2     1  2016       4
#> 3     3  2013       3
#> 4     3  2015       4

reprex 创建于 2018-09-21 包 (v0.2.0).