2012-04-13 12 views
17

Po scaleniu ramki danych z innym im z losowymi NA dla okazyjnego rzędu. Chciałbym ustawić te NA na 0, abym mógł wykonywać z nimi obliczenia.Ustaw NA na 0 w R

Im próbuje zrobić to z:

bothbeams.data = within(bothbeams.data, { 
     bothbeams.data$x.x = ifelse(is.na(bothbeams.data$x.x) == TRUE, 0, bothbeams.data$x.x) 
     bothbeams.data$x.y = ifelse(is.na(bothbeams.data$x.y) == TRUE, 0, bothbeams.data$x.y) 
    }) 

Gdzie $ x.x jest jedną kolumnę i $ x.y jest oczywiście inna, ale to nie wydają się działać.

Odpowiedz

40

można po prostu użyć wyjście is.na zastąpić bezpośrednio z podzbiorów:

bothbeams.data[is.na(bothbeams.data)] <- 0 

Albo z powtarzalny przykład:

dfr <- data.frame(x=c(1:3,NA),y=c(NA,4:6)) 
dfr[is.na(dfr)] <- 0 
dfr 
    x y 
1 1 0 
2 2 4 
3 3 5 
4 0 6 
1

Aby dodać do przykładu Jamesa, wydaje się zawsze musisz utworzyć pośrednik podczas wykonywania obliczeń na ramkach danych zawierających NA.

Na przykład, dodanie dwóch kolumn (A i B), wraz z ramką danych dfr:

temp.df <- data.frame(dfr) # copy the original 
temp.df[is.na(temp.df)] <- 0 
dfr$C <- temp.df$A + temp.df$B # or any other calculation 
remove('temp.df') 

Kiedy to mam wyrzucić potem pośredniego remove/rm.

-1

Dlaczego nie spróbować tego

na.zero <- function (x) { 
     x[is.na(x)] <- 0 
     return(x) 
    } 
    na.zero(df) 
+1

To jest to samo, co zaakceptowana odpowiedź. –

+0

Edytowane zgodnie z moją odpowiedzią .... – Deepesh

5

Roztwór korzystając mutate_all z dplyr w przypadku, gdy chcesz dodać, że do dplyr rurociągu:

library(dplyr) 
df %>% 
    mutate_all(funs(ifelse(is.na(.), 0, .))) 

Wynik:

A B C 
1 1 1 2 
2 2 2 5 
3 3 1 2 
4 0 2 0 
5 1 1 0 
6 2 2 0 
7 3 1 3 
8 0 2 0 
9 1 1 3 
10 2 2 3 
11 3 1 0 
12 0 2 3 
13 1 1 4 
14 2 2 4 
15 3 1 0 
16 0 2 0 
17 1 1 1 
18 2 2 0 
19 3 1 2 
20 0 2 0 

Jeśli w każdym przypadku y ou tylko chcą wymienić NA jest w kolumnach liczbowych, które zakładam, że to może być w przypadku modelowania, można użyć mutate_if:

library(dplyr) 
df %>% 
    mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .))) 

lub w podstawowej R:

replace(is.na(df), 0) 

Wynik:

A B C 
1 1 0 2 
2 2 NA 5 
3 3 0 2 
4 0 NA 0 
5 1 0 0 
6 2 NA 0 
7 3 0 3 
8 0 NA 0 
9 1 0 3 
10 2 NA 3 
11 3 0 0 
12 0 NA 3 
13 1 0 4 
14 2 NA 4 
15 3 0 0 
16 0 NA 0 
17 1 0 1 
18 2 NA 0 
19 3 0 2 
20 0 NA 0 

danych:

set.seed(123) 
df <- data.frame(A=rep(c(0:3, NA), 5), B=rep(c("0", "NA"), 10), C=c(sample(c(0:5, NA), 20, replace = TRUE)))