如何用另一列的值替换 NA
how to replace NA with the values from another column
我想用变量 a
.
中的值替换以下数据框中的 NA
df.NA <- data.frame(
a = c("value1", "value2", "value3", "value4", "value5"),
b = c(NA, 6, 7, NA,8),
c = c(9, NA, NA, 10, 11),
d = c(NA,NA,NA, 12, 13)
)
最终的数据框应该是这样的
df.noNA <- data.frame(
a = c("value1", "value2", "value3", "value4", "value5"),
b = c("value1", 6, 7, "value4",8),
c = c(9, "value2", "value3", 10, 11),
d = c("value1","value2","value3", 12, 13)
)
有没有简单的方法可以做到这一点?
谢谢!
您可以使用 mutate
在每一列中应用 ifelse
。
library(dplyr)
df.NA %>%
mutate(across(everything(), ~ ifelse(is.na(.x), a, .x)))
#> a b c d
#> 1 value1 value1 9 value1
#> 2 value2 6 value2 value2
#> 3 value3 7 value3 value3
#> 4 value4 value4 10 12
#> 5 value5 8 11 13
另一个可能的解决方案:
library(dplyr)
df.NA %>%
mutate(across(-a, ~ coalesce(.x, a)))
#> a b c d
#> 1 1 1 9 1
#> 2 2 6 2 2
#> 3 3 7 3 3
#> 4 4 4 10 12
#> 5 5 8 11 13
在基础 R 中:
ids <- is.na(df.NA)
replace(df.NA, ids, df.NA[which(ids, TRUE)[,1],'a'])
a b c d
1 value1 value1 9 value1
2 value2 6 value2 value2
3 value3 7 value3 value3
4 value4 value4 10 12
5 value5 8 11 13
我想用变量 a
.
df.NA <- data.frame(
a = c("value1", "value2", "value3", "value4", "value5"),
b = c(NA, 6, 7, NA,8),
c = c(9, NA, NA, 10, 11),
d = c(NA,NA,NA, 12, 13)
)
最终的数据框应该是这样的
df.noNA <- data.frame(
a = c("value1", "value2", "value3", "value4", "value5"),
b = c("value1", 6, 7, "value4",8),
c = c(9, "value2", "value3", 10, 11),
d = c("value1","value2","value3", 12, 13)
)
有没有简单的方法可以做到这一点?
谢谢!
您可以使用 mutate
在每一列中应用 ifelse
。
library(dplyr)
df.NA %>%
mutate(across(everything(), ~ ifelse(is.na(.x), a, .x)))
#> a b c d
#> 1 value1 value1 9 value1
#> 2 value2 6 value2 value2
#> 3 value3 7 value3 value3
#> 4 value4 value4 10 12
#> 5 value5 8 11 13
另一个可能的解决方案:
library(dplyr)
df.NA %>%
mutate(across(-a, ~ coalesce(.x, a)))
#> a b c d
#> 1 1 1 9 1
#> 2 2 6 2 2
#> 3 3 7 3 3
#> 4 4 4 10 12
#> 5 5 8 11 13
在基础 R 中:
ids <- is.na(df.NA)
replace(df.NA, ids, df.NA[which(ids, TRUE)[,1],'a'])
a b c d
1 value1 value1 9 value1
2 value2 6 value2 value2
3 value3 7 value3 value3
4 value4 value4 10 12
5 value5 8 11 13