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