2017-11-17 133 views
8
ben artık önceki sütunun değeri ile Nas doldurmak istiyor bu

dolgu sütunu NA

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 

gibi bir veri çerçevesi var

, bu yüzden aşağıdaki gibiyse:

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

böyle elle bunun nasıl biliyorum:

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

nasıl birçok sütunlu bir tam veri çerçeve için bu otomatik hale getirebilirsiniz?

cevap

8
Sen ile yapabilirsiniz

filltidyr den:

library(dplyr) 
library(tidyr) 

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

Sonuç:

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

Not: Temelde

, ben orijinal oryantasyon

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

Bu NA sütun çizgileri arasında değerleri yaymak olacaktır. Bunu istemiyorsanız, sadece döngü bildirimi içindeki dizinlerin sırasını tersine çevirin.

4

Sen apply kullanmak ancak çıkış bir matris

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 
olacağını unutmayın olabilir
6

kullanarak Başka bir seçenek geri aktarılmamıştır Önce aşağı her sütun dolu df aktarılmamıştır Reduceifelse ile:

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

kullanarak
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' tümüyle uygulanabilir Veri çerçevesi bir kerede bu yüzden na.locf (df, na.rm = FALSE) çalışırdı. (Bu özel durumda, 'na.rm = FALSE', hiçbir şey yapmaz, ancak öncü satırlar tüm NA'larsa o zaman onları korurdu.) –

+0

@ G.Grothendieck bunu öğren, teşekkürler :-) – Wen