У меня есть фрейм данных, подобный следующему:
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. Как изменить это, чтобы создать группы с сериями?
Вы можете использовать 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
В 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)
Большой! По сути, вы объединяете два изменения и фильтр в одной строке!