用 R 中另一个数据的值替换一个数据中的 NA?

Replace NA in one data by the value of another data in R?

我有两个数据集,data1 没有 NA 但 data2 有 NA。我想用data1中的相应值替换data2中的NA。

dput(data1)
structure(list(X1 = c(4, 7, 8, 4, 5), X2 = c(2, 1, 1, 2, 1), 
    X3 = c(1, 2, 2, 1, 2)), class = "data.frame", row.names = c(NA, 
-5L))
> data1
  X1 X2 X3
1  4  2  1
2  7  1  2
3  8  1  2
4  4  2  1
5  5  1  2


> dput(data2)
structure(list(X1 = c(10, NA, 9, 8, NA), X2 = c(3, 2, 2, NA, 
1), X3 = c(4, 3, NA, 5, 4)), class = "data.frame", row.names = c(NA, 
-5L))

> data2
  X1 X2 X3
1 10  3  4
2 NA  2  3
3  9  2 NA
4  8 NA  5
5 NA  1  4

预期结果是

> data2
  X1 X2 X3
1 10  3  4
2  7  2  3
3  9  2  2
4  8  2  5
5  5  1  4

感谢任何帮助。

我们可以使用coalesce

library(dplyr)
data2 %>% 
    mutate(across(everything(), ~ coalesce(., data1[[cur_column()]])))

-输出

#  X1 X2 X3
#1 10  3  4
#2  7  2  3
#3  9  2  2
#4  8  2  5
#5  5  1  4

或在base R

i1 <- is.na(data2)
data2[i1] <- data1[i1]

这个有用吗:

library(dplyr)
coalesce(data2, data1)
  X1 X2 X3
1 10  3  4
2  7  2  3
3  9  2  2
4  8  2  5
5  5  1  4

您也可以使用

library(tidyverse)
map2_dfc(data2, data1, coalesce)

# A tibble: 5 x 3
     X1    X2    X3
  <dbl> <dbl> <dbl>
1    10     3     4
2     7     2     3
3     9     2     2
4     8     2     5
5     5     1     4