根据其他列值替换所有缺失值

问题描述 投票:0回答:1

这是一个虚拟数据框来展示我想要实现的目标:

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

目标是将 value1value7 列中的 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 的函数,但到目前为止还没有找到。

提前致谢!

r dataframe dplyr replace na
1个回答
0
投票
df |>
  mutate(across(
    -type,
    ~ coalesce(
      .x,
      case_match(
        type,
        "a" ~ 12,
        "b" ~ 38,
        "c" ~ 50
      )
    )
  ))
© www.soinside.com 2019 - 2024. All rights reserved.