Подмножество фрейма данных dplyr с настраиваемым правилом

У меня есть фрейм данных, подобный следующему:

df <- data.frame(num = c(1, 2, 4, 5, 7, 9, 10), value = c('a', 'b', 'c', 'd', 'e', 'f', 'g'))

Я хотел бы разделить фрейм данных на строки, которые являются непрерывными (последовательными) без разрывов. Мой вывод должен выглядеть следующим образом:

    num value
1     1     a
2     2     b
3     4     c
4     5     d
5     9     f
6    10     g

С помощью кода ниже,

df_subset = df %>% 
  mutate(difference = num - lag(num, default = first(num))) %>%
  filter(difference ==1 | row_number() ==1)

Выход исключает 4 и 9

   num value
1     1     a
2     2     b
3     5     d
4    10     g

потому что значение разницы не равно 1. Как изменить это, чтобы создать группы с сериями?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать diff дважды вместо лагов:

df %>%
  filter(c(1, diff(num))==1 | c(diff(num), NA)==1)

  num value
1   1     a
2   2     b
3   4     c
4   5     d
5   9     f
6  10     g

Большой! По сути, вы объединяете два изменения и фильтр в одной строке!

Arun 27.08.2024 09:31

В collapse вы можете использовать seqid для создания идентификатора для каждой группы последовательных строк. Получите размеры групп с помощью GRPN и сохраните строки, размер группы которых равен 2 или более.

library(collapse)
df[GRPN(seqid(df$num)) > 1, ]

#   num value
# 1   1     a
# 2   2     b
# 3   4     c
# 4   5     d
# 5   9     f
# 6  10     g

Вы также можете использовать collapse в рамках dplyr:

df |> 
  filter(GRPN(seqid(num)) > 1)

Другие вопросы по теме

Как вы можете ссылаться на невыбранные столбцы внутри()?
Есть ли способ объединить даты мероприятия, охватывающего выходные или праздничные дни?
Эффективное использование списка для фильтрации в `dplyr`
R Sports dataframe – объединение и агрегирование данных в нескольких столбцах
Найдите строку со значением, отличным от предыдущей строки в R dplyr
Создайте новый вычисляемый столбец для фрейма данных с несколькими значениями в строке исходного фрейма данных
Как подсчитать, сколько единиц в каждой строке по заданному количеству столбцов в зависимости от количества отсутствующих/NA, присутствующих в каждой строке в R?
Рассчитайте среднее значение даты и часа из многолетнего кадра данных в r
Подсчитайте количество замен, выполненных str_replace_all в рабочем процессе dplyr
Как преобразовать каждую строку во фрейме данных с помощью произвольной функции?