过滤间隙大于或等于数字的日期时间 - R.

时间:2016-06-15 19:01:35

标签: r dplyr

假设我有一个如下数据框,

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时,我在录入前有两个,在录入后有一个。

有人能告诉我如何解决这个问题吗?

由于

2 个答案:

答案 0 :(得分:2)

注意:我使用了一个占位符系列" date"因为它在这段代码的上下文中并不重要。

据我所知,没有单一命令方式来做你需要的事情。我建议用循环来做这个:

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

答案 1 :(得分:1)

您可以在shift中尝试Reducedata.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