2013-07-23 14 views

cevap

10

> ind <- which(is.na(df), arr.ind=TRUE) 
> df[ind] <- rowMeans(df, na.rm = TRUE)[ind[,1]] 
+1

+1 oft-overlooked 'arr.ind' argüman –

+0

iyi bir kullanım varsa, ben NA'ların tüm satırları varsa, bir hata oluşur. Bunu tamamen yeni bir soru olarak ortaya koymak doğru mu? – Brian

2

olduğunu

rwmns = rowMeans(df,na.rm=TRUE) 
df$c1[is.na(df$c1)] = rwmns[is.na(df$c1)] 
df$c2[is.na(df$c2)] = rwmns[is.na(df$c2)] 
df$c3[is.na(df$c3)] = rwmns[is.na(df$c3)] 
> df 
    c1 c2 c3 
1 1 3 2 
2 2 1 1 
3 3 3 3 
4 2 3 1 

Özellikle çok sayıda sütunu olduğunda daha zarif bir yol var mı? apply kullanma umarım bu işe düşünüyorum

+4

Büyük çalışmalarını aktaran sonra library(zoo) den na.aggregate olduğunu. '[[' Yerine dizin indeksini kullanabilirsiniz, böylece her satır 'df [[col_name]] olur [is.na (df [[col_name]])] <- rwmns [is.na (df [[col_name]]) '. Bu şekilde, bir başvuru ailesini, üzerinde değişiklik yapmak istediğiniz sütun adları üzerinde döngü yapabilir veya kullanabilirsiniz. – Justin

4

,

df[which(is.na(df), arr.ind=TRUE)] <- rowMeans(df[!complete.cases(df), ], na.rm=TRUE) 
+0

+1 güzel çözüm! Tembelliğimden çok daha iyi! –

+0

hem is.na hem de complete.cases kullanmak biraz gereksizdir; İki satırda muhtemelen daha verimli bir yol var – baptiste

+1

Bunun gibi belki de? 'idx <- hangisi (is.na (df), arr.ind = TRUE); df [idx] <- rowMeans (df [idx [, 1],], na.rm = DOĞRU) ' –

3

(döndürülen nesne matrix olduğunu unutmayın):

t(apply(df , 1 , function(x) { x[ is.na(x) ] = mean(x , na.rm = TRUE); x })) 
    c1 c2 c3 
[1,] 1 3 2 
[2,] 2 1 1 
[3,] 3 3 3 
[4,] 2 3 1 

Biz her satırda her NA değerlerini değiştirmek için herhangi bir anonim işlevini kullanın Bu satırın mean. Tek avantajı, satır sayısı arttıkça daha fazla yazmanız gerekmez. Bilişsel anlamda özellikle verimli veya hızlı değildir, ancak bilişsel anlamda daha fazladır (000,000 satırınız yoksa). @ Baptiste cevabı çok benzer

2

Diğer bir seçenek kendi çözüm ile geliyor veri kümesi

library(zoo) 
df[] <- t(na.aggregate(t(df))) 
df 
# c1 c2 c3 
#1 1 3 2 
#2 2 1 1 
#3 3 3 3 
#4 2 3 1 
İlgili konular