r - 以特定时间增量提取子序列

时间:2017-08-24 03:01:00

标签: r datetime time subsequence

我有一个数据框df。它有几列,其中两列是datesserial_day,对应于观察日期和MATLAB的序列日。我想限制我的时间序列,使得两个连续观察之间的增量(以天为单位)为3或4,并将这些块与NA行分开。

众所周知,连续的每日观察从未发生,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

我希望得到一个新的数据框:

scrapy.Request("http://www.example.com.html",callback=parse_page1)`

我无法在没有循环的情况下找到一种方法来做到这一点,这在R中是个坏主意。

1 个答案:

答案 0 :(得分: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行减少到单个NA行,您需要检查NA - 行与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
相关问题