簡體   English   中英

篩選間隔大於或等於數字的日期時間-R

[英]Filter for the datetimes that has gap greater than or equal to a number - 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時,我在輸入前得到兩個,在輸入后得到一個。

有人可以給我一些想法如何解決這個問題嗎?

謝謝

注意:我在“日期”中使用了一個占位符系列,因為在此代碼的上下文中這無關緊要。

據我所知,沒有一種命令可以完成所需的工作。 我建議循環執行此操作:

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

你可以嘗試shiftReduce在法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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM