2016-04-20 27 views
2

我需要根據組篩選時間序列數據。然而,過濾必須在每個組的開始(-5分鐘)和結束(-2分鐘)完成,這意味着我想要在每個組的開始(-5分鐘)和結束(-2分鐘)刪除行組。R爲每個組篩選時間序列數據

下面是示例代碼:

Time <- c("2015-08-21T10:00:51", "2015-08-21T10:02:51", "2015-08-21T10:04:51", "2015-08-21T10:06:51", 
      "2015-08-21T10:08:51", "2015-08-21T10:10:51","2015-08-21T10:12:51", "2015-08-21T10:14:51", 
      "2015-08-21T10:16:51", "2015-08-21T10:18:51", "2015-08-21T10:20:51", "2015-08-21T10:22:51") 
x <- c(38.855, 38.664, 40.386, 40.386, 40.195, 40.386, 40.386, 40.195, 40.386, 38.855, 38.664, 40.386) 
y <- c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b") 
data <- data.frame(Time,x,y) 
data$Time <- as.POSIXct(data$Time, format = "%Y-%m-%dT%H:%M:%S") 

Y列顯示我們的基團,其在該特定情況下是一個b

因此,對於這個例子我會刪除3第一行和最後2行爲級別a,對於b相同的事情(在我的原始數據中,根據行數不會很容易將其刪除)。所以我最終會得到這樣的結果:

    Time  x y 
4 2015-08-21 10:06:51 40.386 a 
10 2015-08-21 10:18:51 38.855 b 

我想指出,這只是樣本數據!

感謝您的幫助!

我寧願篩選基於時間列,而不是行數的數據,我原來的數據不會這麼好聽結構類似於每組行的這一個,數量會有所不同。

+0

您能否進一步解釋在每組開始(-5分鐘)和結束(-2分鐘)時需要做什麼? – StrikeR

+0

嘿,我剛剛在我的文章中解釋過它更好 –

回答

1

這個怎麼樣?拆分data.frame,找到前五個和最後兩個分鐘,做一些邏輯查找行並輸出結果。

xy <- split(data, data$y) 

xy <- lapply(xy, FUN = function(m) { 
    m[(m$Time > min(m$Time) + (5 * 60)) & ((max(m$Time) - (2 * 60)) > m$Time), ] 
}) 

do.call("rbind", xy) 

        Time  x y 
a 2015-08-21 10:06:51 40.386 a 
b 2015-08-21 10:18:51 38.855 b 

我知道這些天很酷也提出dplyr解決方案。所以在這裏。

library(dplyr) 

data %>% 
    group_by(y) %>% 
    filter((Time > (min(Time) + (5*60))) & (max(Time) - (2*60) > Time)) 
+0

謝謝,這對'dplyr'很有用。我怎樣才能進一步從數據中刪除這些選定的行? –

+1

我認爲@Roman還沒有看到編輯,但你需要做的就是將'lapply'中的3行代碼改爲如下:'m [(m $ Time> = min(m $ Time)+ (5 * 60))&((MAX(M $時間) - (2 * 60))> = M $時間),]' – StrikeR

+1

或更換'dplyr'代碼'filter'爲以下:'濾波器((時間> =(分鐘(時間)+(5 * 60)))&(最大(時間) - (2 * 60)> =時間))' – StrikeR