2012-05-30 41 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), ]