我有一个数据框,其中包含由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 :(得分:5)
如果dat
是data.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
...