【问题标题】:Extract subset of multiple time series提取多个时间序列的子集
【发布时间】:2016-10-09 07:09:35
【问题描述】:

我的数据如下(我的数据集中有更多变量和组):

group   x   time
1   0   1636
1   0   1637
1   0   1638
1   1   1639
1   1   1640
1   1   1641
1   1   1642
2   0   1683
2   0   1684
2   0   1685
2   0   1686
2   0   1687
2   0   1688
2   1   1689
2   1   1690
2   1   1691
3   0   1638
3   1   1639
3   1   1640

每个group 都有自己的时间序列(由time 表示)。我需要的是在x 为某个组取值 1 之前和之后的固定数量的观察。 例如,总是紧接在 x 之前的 3 个观察值从它取 1 的值开始有 1 个和 3 个观察值(所以之前有 3 个观察值,之后有 3 个观察值)。如果之前或之后没有足够的观察结果,我想删除该组的时间序列。

数据将如下所示:

group   x   time
1   0   1636
1   0   1637
1   0   1638
1   1   1639
1   1   1640
1   1   1641
2   0   1686
2   0   1687
2   0   1688
2   1   1689
2   1   1690
2   1   1691

关于如何做到这一点的任何建议?

【问题讨论】:

    标签: r time-series subset


    【解决方案1】:

    我们通过groupx 创建一个唯一的group_indices(),然后我们过滤具有少于3 个观测值和row_number()s 个观测值的组,其中x != 1%in% 范围n() (组大小)到n()-2 以仅保留x 发生更改之前的3 个观察值。

    library(dplyr)
    
    df %>%
      mutate(g = group_indices_(., .dots = c("group", "x"))) %>%
      group_by(g) %>%
      mutate(condition = ifelse(x == 1, NA, row_number())) %>%
      filter(n() >= 3, ifelse(is.na(condition), TRUE, condition %in% n():(n()-2)))
    

    这给出了:

    #Source: local data frame [13 x 5]
    #Groups: g [4]
    #
    #   group     x  time     g condition
    #   <int> <int> <int> <int>     <int>
    #1      1     0  1636     1         1
    #2      1     0  1637     1         2
    #3      1     0  1638     1         3
    #4      1     1  1639     2        NA
    #5      1     1  1640     2        NA
    #6      1     1  1641     2        NA
    #7      1     1  1642     2        NA
    #8      2     0  1686     3         4
    #9      2     0  1687     3         5
    #10     2     0  1688     3         6
    #11     2     1  1689     4        NA
    #12     2     1  1690     4        NA
    #13     2     1  1691     4        NA
    

    您可以通过将select(-(g:condition)) 添加到链中来选择删除gcondition 列。


    数据

    df <- structure(list(group = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), x = c(0L, 0L, 0L, 1L, 
    1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L), 
        time = c(1636L, 1637L, 1638L, 1639L, 1640L, 1641L, 1642L, 
        1683L, 1684L, 1685L, 1686L, 1687L, 1688L, 1689L, 1690L, 1691L, 
        1638L, 1639L, 1640L)), .Names = c("group", "x", "time"), 
    class = "data.frame", row.names = c(NA, -19L))
    

    【讨论】:

    • 谢谢!这只会保留每组最初的 3 个第一个观测值,而不是 x 变为 1 之前的 3 个观测值。例如,对于第 2 组,时间序列从 1685 跳到 1689,而不是保留观测值 1688、1687 和 1686。跨度>
    • 我可能还没有完全说清楚。在第 2 组中,观察值“1686 1687”和“1688”是 x 取值为 1 之前的观察值。我想提取这 3 个,而目前提取的是“1683,1684”和“1685”。 '1689 1690' 和 '1691' 是在 'x' 取值 1 之后的观察结果,现在是正确的。这清楚吗?所以我想只保留'1686 1687'和'1688'
    • @research111 查看更新的解决方案是否适合您。您可能需要编辑最初的问题以反映请求的更改。
    • 不错的group_indices
    • 最后一个问题。不幸的是,它现在还选择了 x=1 在一个组内之后的最后 3 个值。在我的示例中,组内只有 3 个观察值,其中 1 个,但有时是 4 或 5。因此,对于第 1 组,如果有额外的观察值“group=1;x=1;time=1642”,则选择是1640,1641,1642 而不是 1639,1640,1641
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2023-03-28
    • 2016-09-06
    • 2017-07-04
    • 2014-03-11
    相关资源
    最近更新 更多