#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 ║
╠═══════╬═══════╣
║ 1 ║ 3 ║
╠═══════╬═══════╣
║ 1 ║ 4 ║
╠═══════╬═══════╣
║ 1 ║ 7 ║
╠═══════╬═══════╣
║ 1 ║ 8 ║
╠═══════╬═══════╣
║ 2 ║ 1 ║
╠═══════╬═══════╣
║ 2 ║ 2 ║
╠═══════╬═══════╣
║ 2 ║ 3 ║
╠═══════╬═══════╣
║ 2 ║ 4 ║
╚═══════╩═══════╝
Я бы хотел, чтобы группа 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 Вы профессиональные программисты 🙂 Спасибо за редактирование моего ответа 🙂