在空列中使用 mutate 和 case_when

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

我有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 有问题。

r case na mutate
1个回答
0
投票

您可以通过

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
© www.soinside.com 2019 - 2024. All rights reserved.