2012-04-13 220 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)))