2017-08-24 30 views
0

我有一個數據幀df。它有幾列,其中兩個是datesserial_day,對應於觀察日期和MATLAB的連續日期。我想限制我的時間序列,使得兩次連續觀察之間的增量(以天爲單位)爲3或4,並用NA行分隔這些塊。r - 以特定的時間增量提取子序列

衆所周知,連續的日常觀察不會發生,2天分離後2天分離的情況很少見,因此可以忽略。

在此示例中,爲了方便起見,顯示了increment,但使用diff函數可以輕鬆生成該示例。因此,如果數據幀是

serial_day increment 
1  4   NA 
2  7   3 
3  10   3 
4  12   2 
5  17   5 
6  19   2 
7  22   3 
8  25   3 
9  29   4 
10  34   5 

我希望得到一個新的數據幀:

serial_day      increment 
1  4        NA 
2  7        3 
3  10        3 
4  NA ## Entire row of NAs   NA 
5  19        NA 
6  22        3 
7  25        3 
8  29        4 
9  NA ## Entire row of NAs   NA 

我不能想出一個辦法做到這一點不循環,這是壞主意在R.

+0

不應該刪除第一個'df'中的第6行嗎?該行的增量小於3.如果我正確理解了你的描述,你希望只保留增量爲3或4的行,對嗎? –

+0

@KenS。我想將第6行保留在原始數據框中,因爲從6到7的時間增量爲3。 –

回答

1

首先,你檢查的行增量不等於3或4。然後你用一排NAs替換這些行:

inds <- which(df$increment > 4 | df$increment < 3) 
df[inds, ] <- rep(NA, ncol(df)) 

# serial_day increment 
# 1   4  NA 
# 2   7   3 
# 3   10   3 
# 4   NA  NA 
# 5   NA  NA 
# 6   NA  NA 
# 7   22   3 
# 8   25   3 
# 9   29   4 
# 10   NA  NA 

這可能會導致連續多行NAs。爲了減少這些連續NA -rows到一個NA - 行,你會檢查其中NA -rows位於與which(),然後看到這些位置是否有連續和diff()df刪除這些行:

NArows <- which(rowSums(is.na(df)) == ncol(df))  # c(4, 5, 6, 10) 
inds2 <- NArows[c(FALSE, diff(NArows) == 1)]   # c(5, 6) 
df  <- df[-inds2, ] 

# serial_day increment 
# 1   4  NA 
# 2   7   3 
# 3   10   3 
# 4   NA  NA 
# 7   22   3 
# 8   25   3 
# 9   29   4 
# 10   NA  NA