2013-07-23 13 views

Odpowiedz

10

Bardzo podobny do użytkownika @ Baptiste odpowiedź

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

+1 dobry użytek z często przeoczanego argumentu' arr.ind' –

+0

Znalazłem, jeśli mam całe rzędy NA, wystąpił błąd. Czy jest to właściwa etykieta, aby przedstawić to jako zupełnie nowe pytanie? – Brian

2

Moje rozwiązanie jest

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 

Czy istnieje bardziej elegancki sposób, zwłaszcza gdy ktoś ma wiele kolumn?

+4

Great work wymyślanie własnego rozwiązania. Możesz użyć '[[' do indeksowania zamiast tego, więc każda linia staje się 'df [[nazwa_kolejki]] [is.na (df [[nazwa_pole]]]] - rwmns [is.na (df [[col_name]]) '. W ten sposób możesz zapętlić lub użyć rodziny aplikacji nad nazwami kolumn, które chcesz zastąpić. – Justin

4

myślę, że to działa,

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

+ 1 fajne rozwiązanie !! O wiele lepszy niż mój leniwy 'stosuje się'! –

+0

jest nieco zbędne, aby używać zarówno is.na jak i complete.cases; jest prawdopodobnie bardziej efektywny sposób w dwóch liniach. – baptiste

+1

Może tak? 'idx <- który (is.na (df), arr.ind = TRUE); df [idx] <- rowMeans (df [idx [, 1],], na.rm = TRUE) ' –

3

Korzystanie apply (uwaga zwrócona obiekt jest matrix):

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 

Używamy dowolną funkcję anonimową zmianę wartości każdego NA w każdym rzędzie do mean tego wiersza. Jedyną zaletą jest to, że nie musisz już pisać, jeśli liczba wierszy się zwiększy. Nie jest to szczególnie wydajne ani szybkie w sensie obliczeniowym, ale bardziej w sensie poznawczym (nie zauważysz, chyba że masz 000 000 wierszy).

2

Inną opcją jest na.aggregate z library(zoo) po transpozycji DataSet

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