2015-08-13 2 views
0

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

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, например.

+3

Для дальнейшего использования, там никогда не повод, чтобы удалить вопрос или его название, потому что он отвечает (что помешает ему быть полезным будущим искателям). –

ответ

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] 
0

использование dplyr:

library(dplyr) 
data3 %>% group_by(id) %>% 
      filter(identical(time, seq(first(time), last(time)))) 
Смежные вопросы