【问题标题】:find start and end idx of a time series by group in a data table在数据表中按组查找时间序列的开始和结束 idx
【发布时间】:2021-01-25 20:44:03
【问题描述】:

我的数据表如下所示:

data <- data.table(time = c(0, 1, 2, 3, 4, 5, 6, 7),
                   anom = c(0, 0, 1, 1, 1, 0, 0, 0),
                   gier = c(0, 0, 4, 9, 7, 0, 0, 0))

现在我正在计算按列anom 分组的列gier 的一些统计值,如下所示:

cols <- c("gier")
statFun <- function(x) list(mean = mean(x), median = median(x), std = sd(x))
statSum <- data[, unlist(lapply(.SD, statFun), recursive = FALSE), .SDcols = cols, by = anom]

这很好,但我想更进一步,根据 anom 组(0 和 1)的起点和终点输入 time 的起点和终点。所以最后我有一个新的时间序列,但只有time的起点和终点。所以最终结果应该是这样的:

res <- data.table(x.start     = c(0, 2, 5),
                  x.end       = c(1, 4, 7),
                  anom        = c(0, 1, 0),
                  gier.mean   = c(0, 6.666, 0),
                  gier.median = c(0, 7, 0),
                  gier.std    = c(0, 2.516, 0))

如何做到这一点?

补充:有没有办法实现多列的结果,而不仅仅是像gier 这样的一列?例如,我能够做到这一点,但我不知道如何使用提到的列来扩展它。这样我计算统计值的列名至少有一个额外的列rn

res <- data[, setDT(do.call(rbind.data.frame, lapply(.SD, statFun)), keep.rownames = TRUE), .SDcols = cols, by = anom]

【问题讨论】:

    标签: r time-series data.table grouping


    【解决方案1】:

    您可以在lapply 之外包含额外的计算:

    library(data.table)
    
    data[, unlist(c(lapply(.SD, statFun), 
                  anom = first(anom), x.start = first(time), x.end = last(time)), 
                  recursive = FALSE), rleid(anom), .SDcols = cols]
    
    #   rleid gier.mean gier.median gier.std anom x.start x.end
    #1:     1  0.000000           0 0.000000    0       0     1
    #2:     2  6.666667           7 2.516611    1       2     4
    #3:     3  0.000000           0 0.000000    0       5     7
    

    dplyr 中,我们可以类似地这样做:

    library(dplyr)
    
    data %>%
      group_by(grp = rleid(anom)) %>%
      summarise(across(cols, list(mean = mean, median = median, std = sd)), 
                x.start = first(time), 
                x.end = last(time))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2013-01-11
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多