2016-06-15 2 views
0

Предположим, у меня есть dataframe следующим образом,Фильтр для DateTimes, что имеет разрыв больше, чем или равное число - R

ID date   difference 
1 5/1/2016 4:46 NA 
2 5/1/2016 4:55 9 
3 5/1/2016 5:01 6 
4 5/1/2016 5:09 8 
5 5/1/2016 5:16 7 
6 5/1/2016 5:24 8 
7 5/1/2016 5:31 7 
8 5/1/2016 5:40 9 
9 5/1/2016 5:46 6 
10 5/1/2016 5:49 3 
11 5/1/2016 5:54 5 
12 5/1/2016 5:57 3 
13 5/1/2016 6:10 13 

Здесь я хочу, чтобы фильтровать записи, которые имеют разницу во времени больше или равна до 9. Я хочу отфильтровать две записи до того, как значение разницы времени равно 9 и одна запись после этого. В основном я хочу анализировать тенденции, когда разница во времени превышает 9 минут. Поэтому я хочу сделать две записи до нее и одну запись после этого, чтобы у меня было 4 записи для каждого блока временных записей для исследования.

Я могу фильтровать его непосредственно с одной записью,

data %>% filter(difference >= 9) 

Но я хочу взять две записи перед ней и одну запись после его расследования. В идеале мой выход должен быть, как

ID date   difference 
1 5/1/2016 4:46 NA 
2 5/1/2016 4:55 9 
3 5/1/2016 5:01 6 
6 5/1/2016 5:24 8 
7 5/1/2016 5:31 7 
8 5/1/2016 5:40 9 
9 5/1/2016 5:46 6 
11 5/1/2016 5:54 5 
12 5/1/2016 5:57 3 
13 5/1/2016 6:10 13 

Где, когда разница во времени больше или равно 9, я получаю два до записи и один после записи.

Может кто-нибудь дать мне некоторое представление, как подойти к этому?

Благодаря

ответ

1

Вы можете попробовать shift, Reduce метод data.table, предположим dt ваш data.frame:

library(data.table) 
setDT(dt) 
dt[Reduce("|", c(shift(difference >= 9, n = 0:1, type = "lag"), 
       shift(difference >=9, n = 1:2, type = "lead")))] 

      ID date difference 
1: 5/1/2016 4:46   NA 
2: 5/1/2016 4:55   9 
3: 5/1/2016 5:01   6 
4: 5/1/2016 5:24   8 
5: 5/1/2016 5:31   7 
6: 5/1/2016 5:40   9 
7: 5/1/2016 5:46   6 
8: 5/1/2016 5:54   5 
9: 5/1/2016 5:57   3 
10: 5/1/2016 6:10   13 
+0

Спасибо за это. Это работает. Но если я хочу сгруппировать по какой-либо переменной ранее и сделать это рекурсивно, как я могу это сделать? – haimen

+0

для ex, я не хочу получать предыдущие дни как предыдущие записи, поэтому я группирую их по дням, в этом случае мне нужны только записи в конкретном кэсе, и я не хочу идти на записи предыдущего дня. Поэтому я группирую его каждый день здесь, а затем хочу это сделать. – haimen

+0

В этом случае вы можете попробовать: 'dt [, .SD [Reduce (" | ", c (shift (разность> = 9, n = 0: 1, type =" lag "), shift (разность> = 9, n = 1: 2, type = "lead")))], by = list (ID)] '. где 'ID' - групповая переменная. – Psidom

2

Примечание: Я использовал серию заполнитель для "даты", потому что Безразлично» в контексте этого кода.

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

df <- data.frame(1:13) 
df <- cbind(df,2000:2012,c(NA,9,6,8,7,8,7,9,6,3,5,3,13)) 
colnames(df) <- c("ID","date","difference") 

whichAtLeast9 <- which(df$difference >= 9) 
wantedRows <- whichAtLeast9 

for (i in whichAtLeast9) { 
    entries_before <- c(i-1,i-2) 
    entries_before <- subset(entries_before,entries_before>0) 
    wantedRows <- append(wantedRows,entries_before) 
    entries_after <- i+1 
    entries_after <- subset(entries_after,entries_after<=13) 
    wantedRows <- append(wantedRows,entries_after) 
} 

# Remove duplicates and sort. 
wantedRows <- sort(unique(wantedRows)) 

finaldf <- df[wantedRows,] 

Результат:

> finaldf 
    ID date difference 
1 1 2000   NA 
2 2 2001   9 
3 3 2002   6 
6 6 2005   8 
7 7 2006   7 
8 8 2007   9 
9 9 2008   6 
11 11 2010   5 
12 12 2011   3 
13 13 2012   13 
Смежные вопросы