这是一个虚拟数据框来展示我想要实现的目标:
data.frame(id = c(1,2,3,4,5),
type = c("a","b","a","c","b"),
value1 = c(10,NA,NA,NA,35),
value2 = c(13,NA,NA,NA,39),
value3 = c(8,NA,NA,NA,38),
value4 = c(10,NA,NA,NA,25),
value5 = c(15,NA,NA,NA,44),
value6 = c(5,NA,NA,NA,24),
value7 = c(11,NA,NA,NA,42))
id | 类型 | 值1 | … | 值7 |
---|---|---|---|---|
1 | a | 10 | 11 | |
2 | b | 不适用 | 不适用 | |
3 | a | 不适用 | 不适用 | |
4 | c | 不适用 | 不适用 | |
5 | b | 35 | 42 |
目标是将 value1 至 value7 列中的 NA 替换为根据 type 变化的值。
例如,类型“a”的所有 NA 值将替换为 12,类型“b”的所有 NA 值将替换为 38,而类型“c”的所有 NA 值将替换为 50。
所以想要的结果看起来像这样:
id | 类型 | 值1 | … | 值7 |
---|---|---|---|---|
1 | a | 10 | 11 | |
2 | b | 38 | 38 | |
3 | a | 12 | 12 | |
4 | c | 50 | 50 | |
5 | b | 35 | 42 |
关于如何获得此结果有什么想法吗?
我知道我可以通过这样做来得到这个结果:
df %>%
mutate(value1 = case_when(type == "a" ~ coalesce(value1,12),
type == "b" ~ coalesce(value1,38),
T ~ coalesce(value1,50)))
对所有其他列执行相同的操作,但实际上我有超过 7 个列需要更改。所以这个方法非常不实用。
我一直在寻找一个可以让我替换行中所有 NA 的函数,但到目前为止还没有找到。
提前致谢!
df |>
mutate(across(
-type,
~ coalesce(
.x,
case_match(
type,
"a" ~ 12,
"b" ~ 38,
"c" ~ 50
)
)
))