R:用另一个数据帧中相同位置的值替换 data.frame 中的 NA
R: replacing NAs in a data.frame with values in the same position in another 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
我想用另一个数据帧中相同位置的值替换 NAs:
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
但这没有用。
你可以这样做:
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
在 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
我们可以使用 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 <- 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
中的代码是用 C++ 编写的,因此在大多数情况下速度更快。另一个重要的优点是 coalesce
以及许多其他 dplyr
函数在 SQL 中是相同的。使用 dplyr
,您可以通过在 R
中编码来学习 SQL。 ;-)
我有一个包含一些 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
我想用另一个数据帧中相同位置的值替换 NAs:
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
但这没有用。
你可以这样做:
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
在 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
我们可以使用 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 <- 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
中的代码是用 C++ 编写的,因此在大多数情况下速度更快。另一个重要的优点是 coalesce
以及许多其他 dplyr
函数在 SQL 中是相同的。使用 dplyr
,您可以通过在 R
中编码来学习 SQL。 ;-)