valor - reemplazar na en r
R: reemplazo de NA en un cuadro de datos con valores en la misma posiciĆ³n en otro cuadro de datos (4)
Tengo un marco de datos con algunos valores de NA:
dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA))
dfa
Me gustaría reemplazar los NA con valores en la misma posición en otro marco de datos:
dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3))
dfrepair
Lo intenté:
dfa1 <- dfa
dfa1 <- ifelse(dfa == NA, dfrepair, dfa)
dfa1
pero esto no funciono.
En el tidyverse, puede usar purrr::map2_df
, que es una versión estrictamente bivariada de mapply
que se simplifica en un data.frame, y dplyr::coalesce
, que reemplaza los valores de NA
en su primer argumento con los correspondientes en el segundo.
library(tidyverse)
dfrepair %>%
mutate_all(as.numeric) %>% # coalesce is strict about types
map2_df(dfa, ., coalesce)
## # A tibble: 6 × 3
## a b c
## <dbl> <dbl> <dbl>
## 1 1 1 7
## 2 3 5 7
## 3 3 4 6
## 4 4 3 5
## 5 5 8 2
## 6 7 9 3
Podemos usar Map
from base R
para hacer una comparación en columnas entre los dos conjuntos de datos
dfa[] <- Map(function(x,y) {x[is.na(x)] <- y[is.na(x)]; x}, dfa, dfrepair)
dfa
# a b c
#1 1 1 7
#2 3 5 7
#3 3 4 6
#4 4 3 5
#5 5 8 2
#6 7 9 3
Tu puedes hacer:
dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA))
dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3))
dfa[is.na(dfa)] <- dfrepair[is.na(dfa)]
dfa
a b c
1 1 1 7
2 3 5 7
3 3 4 6
4 4 3 5
5 5 8 2
6 7 9 3
dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA))
dfa
dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3))
dfrepair
library(dplyr)
coalesce(as.numeric(dfa), as.numeric(dfrepair))
a b c
1 1 1 7
2 3 5 7
3 3 4 6
4 4 3 5
5 5 8 2
6 7 9 3
Como el código en dplyr
está escrito en C ++, es más rápido en la mayoría de los casos. Otra ventaja importante es que tanto la coalesce
como muchas otras funciones dplyr
son las mismas en SQL. Usando dplyr
aprendes SQL codificando en R
;-)