type - text size in r
Establezca NA en 0 en R (4)
Para agregar al ejemplo de James, parece que siempre hay que crear un intermedio cuando se realizan cálculos en marcos de datos que contienen NA.
Por ejemplo, agregando dos columnas (A y B) juntas desde un marco de datos 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'')
Cuando hago esto, tiro el intermedio después con remove
/ rm
.
Después de fusionar un marco de datos con otro, me quedo con NA al azar para la fila ocasional. Me gustaría establecer estos NA en 0 para poder realizar cálculos con ellos.
Estoy tratando de hacer esto con:
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)
})
Donde $ xx es una columna y $ xy es la otra, por supuesto, pero esto no parece funcionar.
Porque no intentar esto
na.zero <- function (x) {
x[is.na(x)] <- 0
return(x)
}
na.zero(df)
Puede usar la salida de is.na
para reemplazar directamente con subconjuntos:
bothbeams.data[is.na(bothbeams.data)] <- 0
O con un ejemplo reproducible:
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
Una solución que utiliza mutate_all
de dplyr
en caso de que desee agregarla a su canalización de dplyr
:
library(dplyr)
df %>%
mutate_all(funs(ifelse(is.na(.), 0, .)))
Resultado:
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
Si, en cualquier caso, solo desea reemplazar los NA en columnas numéricas, lo que supongo que podría ser el caso en el modelado, puede usar mutate_if
:
library(dplyr)
df %>%
mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))
o en la base R:
replace(is.na(df), 0)
Resultado:
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
Datos:
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)))