我有2个案例:
同一列可以有以下几种情况:
1.- 拥有 NA 和价值观。
2.- 只有 NA。
我需要在同一列中对这两种情况进行变异,但是,当我尝试空列的情况(仅适用于 NA)时,我收到错误。
如何使用 case_when 处理 mutate 内完全空列的情况并考虑其他情况?
case_1 <- tibble("a" = c("a","a", "a","a"),
"b" = c(NA,"b", NA,"b"))
case_2 <- tibble("a" = c("a","a", "a","a"),
"b" = c(NA,NA,NA,NA))
case_1 <- case_1 %>% mutate("a" = case_when(!is.na(a) ~ a,
is.na(a) ~ na.omit(unique(a))),
"b" = case_when(!is.na(b) ~ b,
is.na(b) ~ na.omit(unique(b))))
case_2 <- case_2 %>% mutate("a" = case_when(!is.na(a) ~ a,
is.na(a) ~ na.omit(unique(a))),
"b" = case_when(!is.na(b) ~ b,
is.na(b) ~ na.omit(unique(b))))
第一个案例(case_1)工作正常,case_2 有问题。
tidyr::fill()
实现您想要做的事情:
case_1 |>
tidyr::fill(b, .direction = "downup")
# a b
# <chr> <chr>
# 1 a b
# 2 a b
# 3 a b
# 4 a b
case_2 |>
tidyr::fill(b, .direction = "downup")
# a b
# <chr> <lgl>
# 1 a NA
# 2 a NA
# 3 a NA
# 4 a NA
但是,在一般情况下,您可以在管道中引入
if
语句,以便在所有值都是 NA
时返回 NA
:
case_2 |> mutate(
"a" = case_when(
!is.na(a) ~ a,
is.na(a) ~ na.omit(unique(a))
),
"b" = if (all(is.na(b))) NA else case_when(
!is.na(b) ~ b,
is.na(b) ~ na.omit(unique(b))
)
)
# a b
# <chr> <lgl>
# 1 a NA
# 2 a NA
# 3 a NA
# 4 a NA