Anche se la domanda posta per la "occorrenza precedente" questo avrebbe lo svantaggio che se il primo Product_Weight
in qualsiasi Product_id
stati NA
allora potrebbe non essere compilati, anche se sapevamo che il Product_Weight
da un successivo Product_id
così invece di utilizzare nell'occorrenza precedente prendiamo la media di tutti i non-NA con lo stesso Product_id
. Poiché questi dovrebbero essere tutti uguali, il loro significato è il loro valore comune.
Se davvero si vuole l'occorrenza precedente utilizzare la funzione Prev
dove:
Prev <- function(x) na.locf(x, na.rm = FALSE)
al posto di na.aggregate
in (1) e (3) e non utilizzare (2).
I seguenti soluzioni presentano i vantaggi che tutti:
La prima soluzione ha l'ulteriore vantaggio di essere solo una riga di codice (più una dichiarazione library
) e la seconda soluzione ha il vantaggio aggiuntivo di non utilizzare alcun pacchetto.
1) zoo :: na.aggregate Usiamo na.aggregate
nel pacchetto zoo (che sostituisce tutti AN con la media del non-AN) e applicarlo Product_Weight
separatamente per ciascun Product_id
.
library(zoo)
transform(DF, Product_Weight = ave(Product_Weight, Product_id, FUN = na.aggregate))
dando:
Product_id Product_Weight Product_Name Shop_Name
1 A 10 xxxx Walmart
2 B 12 yyyy Target
3 C 11 zzzz Target
4 A 10 xxxx Walmart
5 C 11 zzzz Target
2) Nessun pacchetto In alternativa utilizzare Mean
al posto di na.aggregate
dove Mean
è definito come:
Mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))
3) dplyr/Zoo Add numeri di riga, raggruppare per Product_id
, compilare il NAS come nelle soluzioni note utilizzando sia na.aggregate
come quella sottostante oppure Mean
, organizzare ritorna l'ordine originale e rimuovere i numeri di riga:
library(dplyr)
library(zoo)
DF %>%
mutate(row = row_number()) %>%
group_by(Product_id) %>%
mutate(Product_Weight = na.aggregate(Product_Weight)) %>%
ungroup() %>%
arrange(row) %>%
select(-row)
Nota: Questo è stato utilizzato per l'ingresso DF
:
Lines <- " Product_id Product_Weight Product_Name Shop_Name
A 10 xxxx Walmart
B 12 yyyy Target
C 11 zzzz Target
A NA xxxx Walmart
C NA zzzz Target"
DF <- read.table(text = Lines, header = TRUE)
Questi pesi sono sempre impostati in modo che una combinazione Product_id - Product_name restituisca lo stesso peso? – lmo
@lmo Sì, lo sono. – Avis
Un'altra domanda su come sostituire NA: http://stackoverflow.com/questions/32694313/handle-continous-missing-values-in-time-series-data – Jaap