R:将data.frame中的NAs替换为另一个dataframe中相同位置的值

R:将data.frame中的NAs替换为另一个dataframe中相同位置的值,r,dataframe,na,R,Dataframe,Na,我有一个带有一些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 dfa您可以执行以下操作: 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)

我有一个带有一些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
dfa您可以执行以下操作:

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在tidyverse中,您可以使用
purrr::map2_df
,它是
mappy
的严格双变量版本,简化为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
库(tidyverse)
dfrepair%>%
mutate_all(as.numeric)%>%#coalesce对类型要求严格
map2_df(dfa,联合)
###A tible:6×3
##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

我们可以使用
base R
中的
Map
对两个数据集进行列式比较

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

dfa[]
dfa如果创建一个新表而不是修改dfa:
replace(dfa,is.na(dfa),dfrepair[is.na(dfa)]
as.numeric
s错误对我来说是错误的,尽管
coalesce(dfa,dfrepair)
出人意料地有效(文档只讨论向量,而不是整个数据.frames)不要抱怨不同的类型。谢谢你的as.numeric.;-)data.frame是列表和向量的列表。在上述情况下,以及在许多其他情况下,它只是一个包含数字的向量列表。因此,在我们的例子中,它非常类似于矩阵。如果data.frame包含递归列表,我的代码将不会运行。data.frame可能看起来像一个矩阵,但底层结构非常不同。data.frame是一维向量的列表,而矩阵是二维的单个向量。大多数为向量设计的函数不适用于data.frames;
coalesce
中的子集必须是偶然的。
A From:“矩阵和数组只是带有属性dim的向量,并且可以选择将dimname附加到向量上。”例如
x
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
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
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