Удалить данные с пробелами

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

library(data.table)
set.seed(5)
data<-data.table(y=rnorm(100))
data[sample(1:100, 40),]<-NA
id = rep(1:10, each = 10)
time = seq(1,10)
data2<-data.frame(id,time)
data2$row<-1:nrow(data2)
data2a<-subset(data2,row<55|row>61 )
data3<-data2a[-sample(nrow(data2a), 5),]
data.table(data3)
count(data3$id)

Вот хороший пример. Группа 1 должна быть удалена, но не 6, например.

2 ответа

Решение

Условие, которое вы хотите отфильтровать, состоит в том, что нет пробелов больше 1. diff(time) дает вам пробелы, так all(diff(time) == 1) проверяет состояние.

Таким образом, вы можете сделать это с:

library(dplyr)
data3 %>%
    group_by(id) %>%
    filter(all(diff(time) == 1))

В data.table одно решение (которое делает то же самое):

setDT(data3)[, .SD[all(diff(time) == 1)], id]

С помощью dplyr:

library(dplyr)
data3 %>% group_by(id) %>%
          filter(identical(time, seq(first(time), last(time))))
Другие вопросы по тегам