4

我有一个数据框,其中包含由唯一 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有效地从1个数据帧中多个时间序列的开始和结束删除缺失值

4

3 回答 3

6

如果dat是 a data.table,那么这很容易写和读:

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

.SD代表数据子集。 这个答案解释.SD得很好。

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

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

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

于 2012-05-30T15:48:37.417 回答
2

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

DF[ ave(DF$value != 0, DF$id, FUN = any), ]
于 2012-05-30T15:31:44.927 回答
1

一个简单的 plyr解决方案是

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

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

于 2012-05-30T14:57:23.997 回答