2012-04-13 165 views
17

將數據幀與其他即時行中隨機NA留下的im合併後。我想將這些NA設置爲0,以便我可以對它們進行計算。在R中將NA設置爲0

我試着用做到這一點:

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) 
    }) 

其中$ x.x代表一列,$是xy格式的其它,當然,不過這似乎並沒有工作。

回答

40

你可以只使用is.na輸出直接與子集來代替:

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

或者有重複的例子:

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

要添加到詹姆斯的例子,似乎你總是要在含有NA的數據幀上執行計算時創建一箇中間值。

例如,從數據幀dfr增加兩列(A和B)一起:

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') 

當我爲此,我扔掉事後與remove/rm中間。

-1

爲什麼不試試這個

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

這與接受的答案相同。 – 2017-02-05 01:09:20

+0

編輯到我的答案.... – Deepesh 2017-02-07 10:50:14

5

的情況下,使用mutate_alldplyr你想將它添加到您的dplyr管道A液:

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

結果:

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 

如果在任何情況下y OU只需要更換NA在數字列,我以爲這可能是在建模的情況下,你可以使用mutate_if

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

或基礎R:

replace(is.na(df), 0) 

結果:

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 

數據:

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)))