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がの場合data.table、これは書き込みと読み取りが簡単です。

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

.SDデータのサブセットの略です。 この答え.SDは非常によく説明しています。

Gaborの優れた使用法を理解しますがave、同じ変数名()を3回繰り返さずにDF、長いまたは類似の変数名がたくさんある場合はタイプミスの原因になる可能性があります。

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

これら2つの速度の違いは、次のようないくつかの要因に依存する可能性があります。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 に答える