首页 > 解决方案 > 如果组内全部缺失,R替换缺失值

问题描述

如果组中的所有值都丢失,我想从另一列中的值替换缺失值。这是示例,我认为会起作用。可以有无限数量的组。

library(tidyverse)

df <- tibble(ID = c("A", "A", "A", "B", "B", "B"),
       val1 = c(1,2,3,4,5,6),
       val2 = c(NA, NA, NA, NA, 2, 3))

df %>%
group_by(ID) %>%
mutate(val2 = ifelse(all(is.na(val2)), val1, val2))

# Groups:   ID [2]
  ID     val1  val2
  <chr> <dbl> <dbl>
1 A         1     1
2 A         2     1
3 A         3     1
4 B         4    NA
5 B         5    NA
6 B         6    NA

我想得到的是 val2 应该从 val1 中获取值,如果组中缺少所有 val2 值。现在看来,它给了我第一个价值。如果一切都没有丢失,就不应该发生任何事情。

Result:
# A tibble: 6 x 3
  ID     val1  val2
  <chr> <dbl> <dbl>
1 A         1     1
2 A         2     2
3 A         3     3
4 B         4    NA
5 B         5     2
6 B         6     3

标签: r

解决方案


这是否有效:

library(dplyr)
df %>% group_by(ID) %>% mutate(val2 = case_when(all(is.na(val2)) ~ val1, TRUE ~ val2))
# A tibble: 6 x 3
# Groups:   ID [2]
  ID     val1  val2
  <chr> <dbl> <dbl>
1 A         1     1
2 A         2     2
3 A         3     3
4 B         4    NA
5 B         5     2
6 B         6     3

推荐阅读