面板数据:如何删除缺少年度信息的 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).
我有一个包含 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).