从数据框中仅删除零值的时间序列

时间:2012-05-30 14:48:17

标签: r dataframe data.table time-series

我有一个数据框,其中包含由uniquer 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

3 个答案:

答案 0 :(得分:5)

如果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中的列数。

答案 1 :(得分:2)

试试这个。没有使用包裹。

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

答案 2 :(得分:1)

一个简单的plyr解决方案是

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

(似乎工作正常)但data.table ...

可能会有更快的解决方案