siz*_*ght 5 r time-series dataframe zoo data.table
使用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
Run Code Online (Sandbox Code Playgroud)
我想知道,如何有效地从每个时间序列的开始和结束中删除NA值,在本例中为AAA,B和CCC.所以看起来应该是这样的.
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
Run Code Online (Sandbox Code Playgroud)
我会这样做,这应该非常快:
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]
Run Code Online (Sandbox Code Playgroud)
这可以通过向前推进每个群体中流行的非NA,但不会超过最后一个NA.
这mult="last"是可选的.如果使用v1.8.0(在CRAN上),它应该加速它.有和没有它的时间感兴趣.默认情况下,data.table连接到groups(mult="all"),但在这种情况下,我们将加入密钥的所有列,并且,我们知道密钥是唯一的; 即,密钥中没有重复.在v1.8.1(在开发中),没有必要知道这一点,它会照顾你更多.
| 归档时间: |
|
| 查看次数: |
2643 次 |
| 最近记录: |