2013-02-15 20 views
5

Vorrei verificare se un valore di una particolare colonna contiene un valore NA e, in tal caso, riempire lo spazio NA con il valore della riga precedente. Sto ancora cercando di ottenere il blocco della famiglia di funzioni apply.R - Passare attraverso ogni riga e riempire con il valore della riga precedente

E.g. Voglio trasformare questo:

 Date Balance 
2012-01-01  1000 
2012-01-02  NA 
2012-01-03  NA 
2012-01-04  1200 
2012-01-05  1215 
2012-01-06  NA 

in:

 Date Balance 
2012-01-01  1000 
2012-01-02  1000 
2012-01-03  1000 
2012-01-04  1200 
2012-01-05  1215 
2012-01-06  1215 
+2

dare un'occhiata a 'na.locf' dal pacchetto zoo –

+0

Buona ricerca @Jilber. La famiglia 'apply' non funzionerebbe bene qui dato che ciò che si vuole fare su un dato valore dipende da valori vicini (cioè, non si usano gli indici nelle funzioni' apply'). –

+0

Il metodo 'base' più semplice sarebbe probabilmente un ciclo' for' (correggimi se ho torto): 'for (i in 1: length (DF $ Balance)) if (is.na (DF $ Balance [i ])) DF $ Balance [i] = DF $ Balance [i-1] ' –

risposta

7

Questo è un compito per na.locf funzione dal pacchetto zoo. Vedere ?na.locf

Considerate DF è il tuo data.frame, allora:

DF <- read.table(text="  Date Balance 
2012-01-01  1000 
2012-01-02  NA 
2012-01-03  NA 
2012-01-04  1200 
2012-01-05  1215 
2012-01-06  NA", header=TRUE) 

library(zoo) 
na.locf(DF) 
     Date Balance 
1 2012-01-01 1000 
2 2012-01-02 1000 
3 2012-01-03 1000 
4 2012-01-04 1200 
5 2012-01-05 1215 
6 2012-01-06 1215 
5

Utilizzando data.table con roll = TRUE fa anche questo bene!

require(data.table) 
# convert Date column to date format 
df$Date <- as.Date(df$Date) 
# keep this, as we'll remove rows with NA to use `roll` 
dates <- df$Date 
# remove rows with NA 
dt2  <- na.omit(data.table(df)) 
# set key to Date 
setkey(dt2, "Date") 
# use dates which has the NA rows that will be filled 
# with value from previous column with roll=T 
dt2[J(dates), roll=T] 

#   Date Balance 
# 1: 2012-01-01 1000 
# 2: 2012-01-02 1000 
# 3: 2012-01-03 1000 
# 4: 2012-01-04 1200 
# 5: 2012-01-05 1215 
# 6: 2012-01-06 1215 
Problemi correlati