2017-11-11 1 views
0

Ich ersetze NA mit dem letzten vorkommenden Wert in der Spalte mit dem zoo Paket und na.locf. Mein Problem ist, dass die Funktion fehlschlägt, wenn in der letzten Zeile keine Zahlen vorhanden sind. Bitte sehen Sie mein Beispiel.NA am Ende der Spalte mit na.loff Funktion

> tail(Dax1Dax2Dax3) 
      Time Res1 Accum1 Res2 Accum2 Res3 Accum3 
2 2017-10-18 -109.41 171103.61 <NA>  <NA> <NA>  <NA> 
1 2017-10-20 1174.60 172278.21 <NA>  <NA> <NA>  <NA> 
406 2017-10-23 <NA>  <NA> 1473.25 185076.53 <NA>  <NA> 
664 2017-10-25 <NA>  <NA> <NA>  <NA> -80.19 188974.10 
663 2017-10-26 <NA>  <NA> <NA>  <NA> 398.16 189372.27 
662 2017-11-07 <NA>  <NA> <NA>  <NA> -348.37 189023.90 

require(zoo) 

Dax1Dax2Dax3$Accum1 <- na.locf(Dax1Dax2Dax3$Accum1, fromLast = TRUE) 
Error in `$<-.data.frame`(`*tmp*`, Accum1, value = c(253L, 253L, 253L, : 
    replacement has 913 rows, data has 917 

> dim(Dax1Dax2Dax3) 
[1] 917 7 
+0

Sie müssen würden erklären, was Sie mit den Fällen geschehen sollen, wo der letzte Wert ist 'NA' – CPak

+0

Ich denke, den letzten Wert wiederholen in dieser Spalte – user2300940

+0

In diesem Fall zuerst 'na.locf (..., fromLast = TRUE)' und dann ohne 'fromLast = TRUE'. –

Antwort

0

Wir verwenden die fill Funktion aus dem tidyr Paket NA mit dem letzten Wert zurechnen.

library(tidyr) 
Dax1Dax2Dax3 %>% fill(Res1, Accum1, Res2, Accum2) 
#   Time Res1 Accum1 Res2 Accum2 Res3 Accum3 
# 2 2017-10-18 -109.41 171103.6  NA  NA  NA  NA 
# 1 2017-10-20 1174.60 172278.2  NA  NA  NA  NA 
# 406 2017-10-23 1174.60 172278.2 1473.25 185076.5  NA  NA 
# 664 2017-10-25 1174.60 172278.2 1473.25 185076.5 -80.19 188974.1 
# 663 2017-10-26 1174.60 172278.2 1473.25 185076.5 398.16 189372.3 
# 662 2017-11-07 1174.60 172278.2 1473.25 185076.5 -348.37 189023.9 
2

Probieren Sie eine davon aus, je nachdem, was Sie wollen. Die ersten beiden lassen die abschließenden NAs an ihrem Platz und die dritte Alternative erweitert den letzten Wert.

# 1 
Dax1Dax2Dax3$Accum1 <- na.locf(Dax1Dax2Dax3$Accum1, fromLast = TRUE, na.rm = FALSE) 

# 2 
Dax1Dax2Dax3$Accum1 <- na.locf0(Dax1Dax2Dax3$Accum1, fromLast = TRUE) 

# 3 
Dax1Dax2Dax3$Accum1 <- na.locf(Dax1Dax2Dax3$Accum1, fromLast = TRUE, rule = 1) 

Weitere Informationen finden Sie unter ?na.locf.

Hinweis: Die Eingabe in reproduzierbarer Form ist:

Lines <- " 
      Time Res1 Accum1 Res2 Accum2 Res3 Accum3 
2 2017-10-18 -109.41 171103.61 <NA>  <NA> <NA>  <NA> 
1 2017-10-20 1174.60 172278.21 <NA>  <NA> <NA>  <NA> 
406 2017-10-23 <NA>  <NA> 1473.25 185076.53 <NA>  <NA> 
664 2017-10-25 <NA>  <NA> <NA>  <NA> -80.19 188974.10 
663 2017-10-26 <NA>  <NA> <NA>  <NA> 398.16 189372.27 
662 2017-11-07 <NA>  <NA> <NA>  <NA> -348.37 189023.90" 

Dax1Dax2Dax3 <- read.table(text = Lines, na.strings = "<NA>")