我有一个具有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不符合我的需求。
答案 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)])