2016-02-16 77 views
0

我的数据已分组并按日期排列,但对于此处我只是使用数字来简化它。按组别最后一个非NA值替换NA的最新值

我经常在一个时间点缺少值。我想用这个组的最后一个非NA值替换这些NA。我在下面创建了数据框架代码。

在“DATE_RANK”列中的数值越大表明最近的观察,所以我想回顾作为该组

structure(list(Date_Rank = c(3L, 5L, 2L, 1L, 2L, 3L, 4L), Group = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
Value = c(NA, 10L, 30L, 100L, 200L, NA, NA)), .Names = c("Date_Rank", 
"Group", "Value"), class = "data.frame", row.names = c(NA, -7L 
)) 
+0

最后的观察结转了 – MichaelChirico

回答

1

data.table包让你做一个内小DATE_RANK值如果缺少一个滚动连接,它将携带一个值。

library(data.table) 
dt <- as.data.table(df) 
dt2 <- dt[!is.na(Value)] 
setkey(dt, Group, Date_Rank) 
setkey(dt2, Group, Date_Rank) 

dt 
# Date_Rank Group Value 
# 1:   2  A 30 
# 2:   3  A NA 
# 3:   5  A 10 
# 4:   1  B 100 
# 5:   2  B 200 
# 6:   3  B NA 
# 7:   4  B NA 

dt2 
# Date_Rank Group Value 
# 1:   2  A 30 
# 2:   5  A 10 
# 3:   1  B 100 
# 4:   2  B 200 

dt2[dt, roll=Inf] 
# Date_Rank Group Value i.Value 
# 1:   2  A 30  30 
# 2:   3  A 30  NA 
# 3:   5  A 10  10 
# 4:   1  B 100  100 
# 5:   2  B 200  200 
# 6:   3  B 200  NA 
# 7:   4  B 200  NA 
+0

非常感谢。我不是故意粗鲁或不好意思,但有没有data.table的替代方案?我可以使用这个。 – runningbirds

+0

令人惊叹的答案!我不知道data.table合并中的滚动选项!谢谢乔纳森 –

+0

正如在链接的答案中提到的,'zoo :: na.locf'是另一个不错的选择。 –