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

时间:2018-09-21 12:56:49

标签: r time-series panel-data

我有一个具有Id年观测值的数据集。我想比较2015年之前/之后的变化。因此,我需要所有公司在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不符合我的需求。

3 个答案:

答案 0 :(得分:1)

一个想法是将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))),]

答案 1 :(得分:1)

这是另一种选择。我们将遍历每个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 package(v0.2.0)于2018-09-21创建。

答案 2 :(得分:0)

使用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)])