2012-04-13 39 views
17

Sau khi hợp nhất một khung dữ liệu với một imaf còn lại với NA ngẫu nhiên cho hàng không thường xuyên. Tôi muốn đặt NA thành 0 để tôi có thể thực hiện các phép tính với chúng.Đặt NA thành 0 trong R

Im cố gắng để làm điều này với:

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

đâu $ x.x là một cột và $ x.y là khác tất nhiên, nhưng điều này dường như không làm việc.

Trả lời

40

Bạn chỉ có thể sử dụng đầu ra của is.na để thay thế trực tiếp với Subsetting:

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

Hoặc với một ví dụ tái sản xuất:

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

Để thêm vào ví dụ của James, có vẻ như bạn luôn luôn phải tạo trung gian khi thực hiện các phép tính trên khung dữ liệu chứa NA.

Ví dụ, thêm hai cột (A và B) với nhau từ một khung dữ liệu 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') 

Khi tôi làm điều này tôi vứt bỏ các trung gian sau đó với remove/rm.

-1

Tại sao không thử loại này

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

Điều này giống với câu trả lời được chấp nhận. –

+0

Đã chỉnh sửa câu trả lời của tôi .... – Deepesh

5

Một giải pháp sử dụng mutate_all từ dplyr trong trường hợp bạn muốn thêm rằng để dplyr đường ống của bạn:

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

Kết quả:

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 

Nếu trong bất kỳ trường hợp nào y ou chỉ muốn thay thế của NA trong cột số, mà tôi cho rằng nó có thể là trường hợp trong mô hình, bạn có thể sử dụng mutate_if:

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

hoặc trong cơ sở R:

replace(is.na(df), 0) 

Kết quả:

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 

dữ liệu:

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))) 
Các vấn đề liên quan