Фильтрация набора данных панели в r - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть фрейм данных этой формы

familyid memberid occupation panelid year
1        1        1          1       2000
1        2        1          1       2000
2        1        1          1       2000 
2        2        2          1       2000
3        1        1          1       2000
3        2        1          1       2000
3        3        1          1       2000
1        1        2          2       2001
1        2        1          2       2001
2        1        2          2       2001
2        2        2          2       2001
3        1        1          2       2001
3        2        2          2       2001
3        3        2          2       2001

Я хочу отфильтровать этот фрейм данных, чтобы получить следующее.

familyid memberid occupation panelid year
1        1        1          1       2000
2        1        1          1       2000 
3        2        1          1       2000
3        3        1          1       2000
1        1        2          2       2001
2        1        2          2       2001
3        2        2          2       2001
3        3        2          2       2001

Словом, я хочу сохранить толькоГруппа отмечает, что нынешняя профессия == 1 в 2000 году (panelid == 1) и профессия == 2 в 2001 году (panelid == 2).Кто-нибудь знает, как это сделать?Большое спасибо всем,

Марко

1 Ответ

0 голосов
/ 13 февраля 2019

Здесь мы можем сгруппировать по 'familyid', 'memberid', filter на основе any 'род занятий' 1 и 'год' 2000, а также any 'род занятий' 2 и 'год' 2001

library(tidyverse)
df1 %>% 
  group_by(familyid, memberid) %>% 
  filter(any(occupation == 1 & year == 2000) & any(occupation == 2 & year == 2001))
# A tibble: 8 x 5
# Groups:   familyid, memberid [4]
#  familyid memberid occupation panelid  year
#     <int>    <int>      <int>   <int> <int>
#1        1        1          1       1  2000
#2        2        1          1       1  2000
#3        3        2          1       1  2000
#4        3        3          1       1  2000
#5        1        1          2       2  2001
#6        2        1          2       2  2001
#7        3        2          2       2  2001
#8        3        3          2       2  2001

Или если уровни 'занятие' и 'год' равны только двум, то мы также можем подсчитать с помощью n_distinct, чтобы создать логический вектор для filter ing

df1 %>% 
  group_by(familyid, memberid) %>%
  filter(n_distinct(occupation) >1 & n_distinct(year)> 1)

данные

df1 <- structure(list(familyid = c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 
2L, 2L, 3L, 3L, 3L), memberid = c(1L, 2L, 1L, 2L, 1L, 2L, 3L, 
1L, 2L, 1L, 2L, 1L, 2L, 3L), occupation = c(1L, 1L, 1L, 2L, 1L, 
1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L), panelid = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), year = c(2000L, 
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L)), class = "data.frame", row.names = c(NA, 
-14L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...