【问题标题】:Removing time series with only zero values from a data frame从数据框中删除只有零值的时间序列
【发布时间】:2025-12-29 23:25:07
【问题描述】:

我有一个数据框,其中包含由唯一 ID 标识的多个时间序列。我想删除任何只有 0 个值的时间序列。

数据框如下,

id   date          value
AAA  2010/01/01    9
AAA  2010/01/02    10
AAA  2010/01/03    8
AAA  2010/01/04    4
AAA  2010/01/05    12
B    2010/01/01    0
B    2010/01/02    0
B    2010/01/03    0
B    2010/01/04    0
B    2010/01/05    0
CCC  2010/01/01    45
CCC  2010/01/02    46
CCC  2010/01/03    0
CCC  2010/01/04    0
CCC  2010/01/05    40

我希望删除任何只有 0 个值的时间序列,以便数据框如下所示,

id   date          value
AAA  2010/01/01    9
AAA  2010/01/02    10
AAA  2010/01/03    8
AAA  2010/01/04    4
AAA  2010/01/05    12
CCC  2010/01/01    45
CCC  2010/01/02    46
CCC  2010/01/03    0
CCC  2010/01/04    0
CCC  2010/01/05    40

这是对上一个问题的跟进,该问题使用data.tables 包得到了非常好的解决方案。

R efficiently removing missing values from the start and end of multiple time series in 1 data frame

【问题讨论】:

  • 数据框 id 是否总是排序的?
  • @Fhnuzoag 我按 id 和 date 对数据框进行了排序
  • 如果数据框已经排序,那么可能有比 ave 方法更快的方法。但这可能不值得。

标签: r dataframe data.table time-series


【解决方案1】:

试试这个。不使用任何包。

DF[ ave(DF$value != 0, DF$id, FUN = any), ]

【讨论】:

    【解决方案2】:

    如果datdata.table,那么这很容易写和读:

    dat[,.SD[any(value!=0)],by=id]
    

    .SD 代表数据子集。 This answer 很好地解释了.SD

    借鉴 Gabor 对 ave 的巧妙使用,但不要重复相同的变量名 (DF) 三次,如果您有很多长或相似的变量名,这可能是拼写错误的根源,请尝试:

    dat[ ave(value!=0,id,FUN=any) ]
    

    这两者之间的速度差异可能取决于几个因素,包括:i) 组数 ii) 每个组的大小和 iii) 真实 dat 中的列数。

    【讨论】:

    • 感谢您的解决方案。您的 data.table 包非常有用。让我自己更容易处理数据。
    【解决方案3】:

    一个简单的plyr 解决方案是

    ddply(mydat,"id",function(x) if (all(x$value==0)) NULL else x)
    

    (似乎工作正常)但data.table 可能有更快的解决方案...

    【讨论】: