使用R,我试图从包含多个时间序列的数据帧的开始和结束处修剪NA值。我使用了for循环和zoo包实现了我的目标,但是正如预期的那样,在大型数据帧上它效率极低。

我的数据框如下所示,包含3列,每个时间序列均由其唯一ID标识。在这种情况下为AAA,B和CCC。

id   date          value
AAA  2010/01/01    NA
AAA  2010/02/01    34
AAA  2010/03/01    35
AAA  2010/04/01    30
AAA  2010/05/01    NA
AAA  2010/06/01    28
B    2010/01/01    NA
B    2010/02/01    0
B    2010/03/01    1
B    2010/04/01    2
B    2010/05/01    3
B    2010/06/01    NA
B    2010/07/01    NA
B    2010/07/01    NA
CCC  2010/01/01    0
CCC  2010/02/01    400
CCC  2010/03/01    300
CCC  2010/04/01    200
CCC  2010/05/01    NA

我想知道,如何才能有效地从每个时间序列的开头和结尾(在这种情况下为AAA,B和CCC)删除NA值。所以它应该看起来像这样。
id   date          value
AAA  2010/02/01    34
AAA  2010/03/01    35
AAA  2010/04/01    30
AAA  2010/05/01    NA
AAA  2010/06/01    28
B    2010/02/01    0
B    2010/03/01    1
B    2010/04/01    2
B    2010/05/01    3
CCC  2010/01/01    0
CCC  2010/02/01    400
CCC  2010/03/01    300
CCC  2010/04/01    200

最佳答案

我会这样,应该很快:

require(data.table)
DT = as.data.table(your data)   # please provide something pastable

DT2 = DT[!is.na(value)]
setkey(DT,id,date)
setkey(DT2,id,date)
tokeep = DT2[DT,!is.na(value),rolltolast=TRUE,mult="last"]
DT = DT[tokeep]

这可以通过在每个组中前滚当前的非NA,但不超过最后一个。
mult="last"是可选的。如果使用v1.8.0(在CRAN上),则应加快速度。对有或没有它的时机很感兴趣。默认情况下,data.table连接到组(mult="all"),但是在这种情况下,我们要连接到键的所有列,并且,我们知道键是唯一的。即,没有 key 上的复制。在v1.8.1(开发版)中,无需了解这一点,它可以帮助您更多。

关于r - 有效地从1个数据帧中的多个时间序列的开始和结束中删除缺失值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10811357/

10-12 17:48