2016-02-16 2 views
0

Mes données sont groupées et également classées par date, mais pour cela, je vais simplement utiliser un nombre pour le garder simple.Remplacement de la dernière valeur NA par la dernière valeur non-NA par le groupe

J'ai souvent des valeurs manquantes à un moment donné. Je voudrais remplacer ces NA avec la dernière valeur NON-NA pour ce groupe. J'ai la création de code de trame de données ci-dessous.

Un plus grand nombre dans la colonne « DATE_RANK » indique une observation plus récente, donc je voudrais revenir sur les valeurs de DATE_RANK qui sont plus petits au sein de ce groupe

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

dernière observation reportée – MichaelChirico

Répondre

1

Le paquet data.table vous permet de faire un rolling-join qui portera une valeur vers l'avant s'il en manque une.

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

Merci beaucoup. Je ne veux pas être grossier ou ingrat, mais existe-t-il une alternative à data.table? Je peux l'utiliser cependant. – runningbirds

+0

Réponse incroyable! Je ne connaissais pas l'option roll dans data.table merge! Merci Jonathan –

+0

Comme mentionné dans la réponse liée, 'zoo :: na.locf' est une autre bonne option. –