【问题标题】:r - Extract subsequences with specific time incrementsr - 提取具有特定时间增量的子序列
【发布时间】:2017-08-24 03:00:59
【问题描述】:

我有一个数据框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

如果不循环,我想不出办法做到这一点,这在 R 中是个坏主意。

【问题讨论】:

  • 第一个df中的第6行不应该也被删除吗?该行的增量小于 3。如果我正确理解您的描述,您希望只保留增量为 3 或 4 的行,对吗?
  • @KenS。我想将第 6 行保留在原始数据框中,因为从 6 到 7 的时间增量为 3。

标签: r datetime time subsequence


【解决方案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-rows,您将使用which() 检查NA-rows 的位置,然后查看这些位置是否与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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 2015-01-17
    • 2021-02-04
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多