2013-02-15 36 views
5

से मूल्य के साथ भरें। मैं यह जांचना चाहता हूं कि किसी विशेष कॉलम के मान में NA मान है, और यदि ऐसा है, तो उस एनए स्पेस को पिछली पंक्ति से मान के साथ भरें। मैं अभी भी apply कार्यों के परिवार की लटक पाने की कोशिश कर रहा हूं।आर - प्रत्येक पंक्ति के माध्यम से लूप करें और पिछली पंक्ति

उदा। मैं इस चालू करना चाहते हैं:

 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 

में:

 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

चिड़ियाघर पैकेज –

+0

अच्छा खोजने @Jilber से 'na.locf' पर एक नज़र डालें। 'लागू' परिवार यहां अच्छा काम नहीं करेगा क्योंकि आप किसी दिए गए मूल्य पर क्या करना चाहते हैं, आस-पास के मूल्यों पर निर्भर करता है (यानी, आप 'लागू' कार्यों में सूचकांक का उपयोग नहीं करते हैं)। –

+0

सबसे सरल 'आधार' विधि शायद 'लूप' के लिए होगी (अगर मैं गलत हूं तो मुझे सही करें): 'के लिए (i में 1: लंबाई (डीएफ $ बैलेंस)) (is.na (डीएफ $ बैलेंस [i ])) डीएफ $ बैलेंस [i] = डीएफ $ बैलेंस [i-1] ' –

उत्तर

7

इस चिड़ियाघर पैकेज से na.locf समारोह के लिए एक काम है। देखें ?na.locf

पर विचार करें DF अपने data.frame होती है तो:

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

roll = TRUE साथ data.table का उपयोग करना भी अच्छी तरह से इस करता है!

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