данные панели: как удалить идентификаторы с отсутствующей годовой информацией - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть набор данных с наблюдениями за 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 голосов
/ 21 сентября 2018

С 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)])
0 голосов
/ 21 сентября 2018

Вот еще один вариант.Мы перебираем данные в каждом идентификаторе и фильтруем любую группу, у которой нет данных 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

Создано в 2018-09-21 пакетом представлением (v0.2.0).

0 голосов
/ 21 сентября 2018

Идея состоит в том, чтобы использовать 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))),]
...