Как создать подмножество групп с полными последовательными месяцами

#r

#r

Вопрос:

Я пытаюсь создать подмножество групп с полными последовательными месяцами в R.

Например, если есть данные, которые выглядят как:

 structure(list(Group = c(1, 1, 1, 1, 2, 2, 2, 2), Month = c(3, 
4, 7, 8, 1, 2, 3, 4)), class = "data.frame", row.names = c(NA, 
-8L), codepage = 65001L)
  

В таблице это выглядит так:

 ╔═══════╦═══════╗
║ Group ║ Month ║
╠═══════╬═══════╣
║ 13     ║
╠═══════╬═══════╣
║ 14     ║
╠═══════╬═══════╣
║ 17     ║
╠═══════╬═══════╣
║ 18     ║
╠═══════╬═══════╣
║ 21     ║
╠═══════╬═══════╣
║ 22     ║
╠═══════╬═══════╣
║ 23     ║
╠═══════╬═══════╣
║ 24     ║
╚═══════╩═══════╝
  

Я бы хотел, чтобы группа 1 была удалена, потому что в последовательные месяцы есть «переход» (нет месяца 5, 6).

Ответ №1:

Базовым решением R может быть использование ave , т.е.

 df[!!with(df, ave(Month, Group, FUN = function(i)all(diff(i) == 1))),]

#  Group Month
#5     2     1
#6     2     2
#7     2     3
#8     2     4
  

Ответ №2:

Одним dplyr из вариантов может быть:

 df %>%
 group_by(Group) %>%
 filter(all(diff(Month) == 1))

  Group Month
  <dbl> <dbl>
1     2     1
2     2     2
3     2     3
4     2     4
  

Ответ №3:

Вот базовый вариант R, использующий subset ave

 > subset(df,as.logical(ave(Month,Group, FUN = function(x) all(diff(x)==1))))
  Group Month
5     2     1
6     2     2
7     2     3
8     2     4
  

Ответ №4:

Также допустимо сопоставить количество наблюдений во всех группах и проверить, все ли различия равны единице:

 library(tidyverse)
#Code
df %>% group_by(Group) %>%
  mutate(Diff=c(1,diff(Month)),
         Value=n()==sum(Diff==1)) %>%
  filter(Value) %>% ungroup() %>% select(-c(Value,Diff))
  

Вывод:

 # A tibble: 4 x 2
  Group Month
  <dbl> <dbl>
1     2     1
2     2     2
3     2     3
4     2     4
  

Некоторые используемые данные:

 #Data
df <- structure(list(Group = c(1, 1, 1, 1, 2, 2, 2, 2), Month = c(3, 
4, 7, 8, 1, 2, 3, 4)), class = "data.frame", row.names = c(NA, 
-8L), codepage = 65001L)
  

Комментарии:

1. Вы выбрали самый длинный возможный путь: P . Мое редактирование связано с фильтрацией на основе логических столбцов. Вам не нужно переделывать его логически ==TRUE

2. @Sotos Вы профессиональные программисты 🙂 Спасибо за редактирование моего ответа 🙂