Фильтровать сгруппированные данные по строкам, в которых изменяется группировка - PullRequest
0 голосов
/ 19 сентября 2018

С этими данными (ниже с dput()), где IndIDII - столбец группировки, внутри которого есть несколько наблюдений MigStratFact для каждого Year.

> head(Dat)
  IndIDII Year MigStratFact
1 BHS_376 2015      MidDist
2 BHS_376 2016      MidDist
3 BHS_376 2017      MidDist
4 BHS_376 2018    ShortDist
5 BHS_378 2015      MidDist
6 BHS_378 2016    ShortDist

Я бынравится фильтровать Dat по строкам, где lead() значение MigStratFact не соответствует текущему значению, И также сохраняет текущее поле.

Используя приведенный ниже код, для каждого IndIDII я могу фильтровать строки, где lead(MigStratFact) != MigStratFact, но не уверен, как также сохранить исходную (т. Е. Текущую) строку.

Dat %>%
  group_by(IndIDII) %>% 
  filter(lead(MigStratFact) != MigStratFact) %>% 
  as.data.frame()

Желаемое решение будет отфильтровано по строкам 3,4,5,6,8,9,11,12,15,16.

Заранее большое спасибо

Dat <- structure(list(IndIDII = c("BHS_376", "BHS_376", "BHS_376", "BHS_376", 
    "BHS_378", "BHS_378", "BHS_378", "BHS_391", "BHS_391", "BHS_394", 
    "BHS_394", "BHS_394", "BHS_395", "BHS_395", "BHS_395", "BHS_395"
    ), Year = c("2015", "2016", "2017", "2018", "2015", "2016", "2017", 
    "2015", "2016", "2016", "2017", "2018", "2015", "2016", "2017", 
    "2018"), MigStratFact = structure(c(3L, 3L, 3L, 2L, 3L, 2L, 2L, 
    2L, 3L, 3L, 3L, 2L, 3L, 3L, 3L, 2L), .Label = c("Resident", "ShortDist", 
    "MidDist", "LongDist"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -16L))

Ответы [ 2 ]

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

@ konvas, ответ трудно найти, но здесь другое решение.Я взял на себя задачу фильтрации по индексу, а не по логическому, но я признаю, что это немного трудно читать.

Dat %>%
  group_by(IndIDII) %>% 
  filter(row_number() %in% c(a <-  which(lead(MigStratFact) != MigStratFact), a + 1))

# A tibble: 10 x 3
# Groups:   IndIDII [5]
   IndIDII Year  MigStratFact
   <chr>   <chr> <fct>       
 1 BHS_376 2017  MidDist     
 2 BHS_376 2018  ShortDist   
 3 BHS_378 2015  MidDist     
 4 BHS_378 2016  ShortDist   
 5 BHS_391 2015  ShortDist   
 6 BHS_391 2016  MidDist     
 7 BHS_394 2017  MidDist     
 8 BHS_394 2018  ShortDist   
 9 BHS_395 2017  MidDist     
10 BHS_395 2018  ShortDist
0 голосов
/ 19 сентября 2018

Попробуйте изменить на

Dat %>%
  group_by(IndIDII) %>% 
  filter(lead(MigStratFact) != MigStratFact | lag(MigStratFact) != MigStratFact)
#    IndIDII Year MigStratFact
# 1  BHS_376 2017      MidDist
# 2  BHS_376 2018    ShortDist
# 3  BHS_378 2015      MidDist
# 4  BHS_378 2016    ShortDist
# 5  BHS_391 2015    ShortDist
# 6  BHS_391 2016      MidDist
# 7  BHS_394 2017      MidDist
# 8  BHS_394 2018    ShortDist
# 9  BHS_395 2017      MidDist
# 10 BHS_395 2018    ShortDist
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...