Подтвердить что ты не робот

R: замена NA в кадре данных со значениями в одной и той же позиции в другом фрейме данных

У меня есть dataframe с некоторыми значениями 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

Я хотел бы заменить NA на значения в одной позиции в другом фрейме:

dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3))
dfrepair

Я пробовал:

dfa1 <- dfa

dfa1 <- ifelse(dfa == NA, dfrepair, dfa)
dfa1

но это не сработало.

4b9b3361

Ответ 1

Вы можете сделать:

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

Ответ 2

В tidyverse вы можете использовать purrr::map2_df, который является строго двумерной версией mapply, которая упрощает к data.frame и dplyr::coalesce, который заменяет значения NA в своем первом аргументе соответствующим во втором.

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

Ответ 3

Мы можем использовать Map из base R для сравнения по столбцам между двумя наборами данных

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

Ответ 4

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

Поскольку код в dplyr написан на С++, в большинстве случаев он быстрее. Другим важным преимуществом является то, что coalesce, а также многие другие функции dplyr одинаковы в SQL. Используя dplyr, вы изучаете SQL путем кодирования в R.; -)