2012-05-30 88 views
3

我有一個數據幀,其中包含由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

+0

數據框ID是否總是排序? – Fhnuzoag

+0

@Fhnuzoag我按ID和日期對數據幀排序 – sizeight

+0

如果數據幀已經排序,那麼可能比ave方法更快。但它可能不值得。 – Fhnuzoag

回答

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

+0

感謝您的解決方案。你的data.table包真的很有用。使我自己的數據變得更容易。 – sizeight

1

一個簡單plyr的解決辦法是

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

(似乎工作正常),但有可能是一個data.table更快的解決方案......

2

試試這個。沒有包被使用。

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