2012-11-01 13 views
21

Możliwe Duplikat:
Set NA to 0 in RWymiana wartości nA z kolumny z 0 na dane ramki B

mam data.frame z kolumną o NA wartości. Chcę zastąpić NA z 0 lub inną wartością. Próbowałem wielu wątków i metod, ale nie dało mi to rezultatu. Próbowałem poniższych metod.

a$x[a$x==NA]<-0; 
a[,c("x")]<-apply(a[,c("x")],1,function(z){replace(z, is.na(z), 0)}); 
a$x[is.na(a$x),]<-0; 

Żadne z powyższych metod otrzymuje NA z 0 w kolumnie x do data.frame a. Czemu?

+0

Chcesz zastąpić 'NA' z' 0' we wszystkich kolumnach, lub po prostu kolumnie 'x'? – A5C1D2H2I1M1N2O1R2T1

+0

@ mrdwab: po prostu kolumna x –

Odpowiedz

43

Ponieważ nikt do tej pory czułem się zdolny do wskaż dlaczego to, czego próbujesz, nie działa:

  1. NA == NA nie zwraca TRUE, zwraca NA (ponieważ porównanie z niezdefiniowanymi wartościami powinno dać nieokreślony wynik).
  2. Próbujesz wywołać apply na wektorze atomowym. Nie można użyć apply do zapętlenia elementów w kolumnie.
  3. Twoje indeksy są wyłączone - próbujesz podać dwa indeksy w a$x, która jest po prostu kolumną (wektor atomowy).

bym naprawić 3. dostać się do a$x[is.na(a$x)] <- 0

8

pierwsze, oto niektóre dane przykładowe:

set.seed(1) 
dat <- data.frame(one = rnorm(15), 
       two = sample(LETTERS, 15), 
       three = rnorm(15), 
       four = runif(15)) 
dat <- data.frame(lapply(dat, function(x) { x[sample(15, 5)] <- NA; x })) 
head(dat) 
#   one two  three  four 
# 1   NA M 0.80418951 0.8921983 
# 2 0.1836433 O -0.05710677  NA 
# 3 -0.8356286 L 0.50360797 0.3899895 
# 4   NA E   NA  NA 
# 5 0.3295078 S   NA 0.9606180 
# 6 -0.8204684 <NA> -1.28459935 0.4346595 

Oto nasza wymiana:

dat[["four"]][is.na(dat[["four"]])] <- 0 
head(dat) 
#   one two  three  four 
# 1   NA M 0.80418951 0.8921983 
# 2 0.1836433 O -0.05710677 0.0000000 
# 3 -0.8356286 L 0.50360797 0.3899895 
# 4   NA E   NA 0.0000000 
# 5 0.3295078 S   NA 0.9606180 
# 6 -0.8204684 <NA> -1.28459935 0.4346595 

Alternatywnie można oczywiście napisać dat$four[is.na(dat$four)] <- 0

+0

to coś działało. Dużo. Czy mógłbyś zasugerować, jeśli zrobiłem coś złego w powyższych metodach próbowałem. –

+0

to nie jest "alternatywnie" rozwiązanie o wiele lepsze tylko ze względu na jego prostotę? Czy użycie dwóch podwójnych uchwytów ma jakąkolwiek przewagę? –

+0

@MikePalmice, na pewno. "Alternatywnie" rozwiązanie będzie problematyczne, jeśli próbujesz podejść do problemu programowo (na przykład w ramach funkcji). – A5C1D2H2I1M1N2O1R2T1