2017-11-17 71 views
8

मैं इसभरने स्तंभ अगर एनए

df <- data.frame(v1 = 10:14, v2 = c(NA, 1, NA, 3, 6), v3 = c(1, NA, NA, 9, 4)) 

    v1 v2 v3 
1 10 NA 1 
2 11 1 NA 
3 12 NA NA 
4 13 3 9 
5 14 6 4 

अब मैं पिछले कॉलम के मूल्य के साथ NAS भरना चाहते हैं की तरह एक डेटा फ्रेम है, तो यह इस तरह दिखता है:

v1 v2 v3 
1 10 10 1 
2 11 1 1 
3 12 12 12 
4 13 3 9 
5 14 6 4 

मुझे पता है कि इस तरह से मैन्युअल रूप से ऐसा करने के लिए,:

df$v2 <- ifelse(is.na(df$v2), df$v1, df$v2) 

मैं कैसे कई कॉलम के साथ एक पूर्ण डेटा फ्रेम के लिए इस स्वचालित कर सकते हैं?

उत्तर

8

आप के साथ ऐसा कर सकते हैं filltidyr से:

library(dplyr) 
library(tidyr) 

data.frame(t(df)) %>% 
    fill(., names(.)) %>% 
    t() 

परिणाम:

v1 v2 v3 
X1 10 10 1 
X2 11 1 1 
X3 12 12 12 
X4 13 3 9 
X5 14 6 4 

नोट:

असल में, मैं df स्थानांतरित, हर स्तंभ नीचे भरा है, तो मूल उन्मुखीकरण

6
for (i in 2:ncol(df)) 
    df[,i] = ifelse(is.na(df[,i]), df[,i-1],df[,i]) 

यह एनए कॉलम की सीमाओं के मूल्यों को प्रसारित करेगा। यदि आप यह नहीं चाहते हैं, तो लूप घोषणा के लिए इंडेक्स के क्रम को उलट दें।

4

आप apply का उपयोग लेकिन ध्यान दें कि उत्पादन एक मैट्रिक्स

t(apply(df, 1, function(x){ 
    replace(x, is.na(x), x[cumsum(!is.na(x))][is.na(x)]) 
})) 
#  v1 v2 v3 
#[1,] 10 10 1 
#[2,] 11 1 1 
#[3,] 12 12 12 
#[4,] 13 3 9 
#[5,] 14 6 4 
हो जाएगा सकता है
6

का उपयोग कर एक अन्य विकल्प के लिए इसे वापस स्थानांतरित Reduceifelse साथ:

df[] <- Reduce(function(x, y) ifelse(is.na(y), x, y), df, accumulate = TRUE) 

df 
# v1 v2 v3 
#1 10 10 1 
#2 11 1 1 
#3 12 12 12 
#4 13 3 9 
#5 14 6 4 
4

zoona.locf

का उपयोग करके
data.frame(t(apply(df,1,function(x) na.locf(x)))) 
    v1 v2 v3 
1 10 10 1 
2 11 1 1 
3 12 12 12 
4 13 3 9 
5 14 6 4 
+1

'na.locf' पूरी तरह से लागू किया जा सकता है डेटा फ्रेम एक बार में 'na.locf (df, na.rm = FALSE)' काम करेगा। (इस विशेष मामले में 'na.rm = FALSE' कुछ भी नहीं करता है, लेकिन यदि प्रमुख पंक्तियां सभी एनएएस थीं तो यह उन्हें संरक्षित रखेगी।) –

+0

@ जी। ग्रिथेंडिक इसे सीखें, धन्यवाद :-) – Wen

संबंधित मुद्दे