如何将case_when与rowwise一起用于计算缺失值

368yc8dk  于 2023-06-27  发布在  其他
关注(0)|答案(2)|浏览(96)

我有许多缺失值的数据,我想计算所有非缺失值的每行的最大值。我使用case_when,因为我不想为所有NA的行计算最大值。
示例:

library(tidyverse)

data <- tibble(col_a = rep(c(2, 1, NA_real_), each = 2), 
               col_b = rep(c(2, 1, NA_real_), times = 2)) %>% 
  rowwise() %>% 
  mutate(count_not_na = sum(!is.na(c(col_a, col_b))),
         max_value = case_when(count_not_na > 0 ~ max(c(col_a, col_b), na.rm = T),
                                                      T ~ NA_real_))

我得到预期的输出,即:
| col_a| cvol_B| count_not_na|最大值|
| - -----|- -----|- -----|- -----|
| 2| 2| 2| 2|
| 2|一个|2| 2|
| 一个|不适用|一个|一个|
| 一个|2| 2| 2|
| 不适用|一个|一个|一个|
| 不适用|不适用|0|不适用|
虽然代码按预期工作,但我得到以下警告:

Warning message:
There was 1 warning in `mutate()`.
ℹ In argument: `max_value = case_when(...)`.
ℹ In row 6.
Caused by warning in `max()`:
! no non-missing arguments to max; returning -Inf

显然,当第6行的情况不像我想要的那样工作时,最大值不应该被评估,因为所有的值都是NA。
我错过了什么?如何把上面写得更“美”?
我很高兴任何建议!谢谢你!

lrl1mhuk

lrl1mhuk1#

使用pmax

data <- tibble(col_a = rep(c(2, 1, NA_real_), each = 2), 
               col_b = rep(c(2, 1, NA_real_), times = 2))

data %>% 
  mutate(
    count_not_na = rowSums(!is.na(.[1:2])), 
    max_value = pmax(col_a, col_b, na.rm = TRUE))

输出

# A tibble: 6 × 4
  col_a col_b count_not_na max_value
  <dbl> <dbl>        <dbl>     <dbl>
1     2     2            2         2
2     2     1            2         2
3     1    NA            1         1
4     1     2            2         2
5    NA     1            1         1
6    NA    NA            0        NA
bfnvny8b

bfnvny8b2#

case_when的文档明确指出,在选择适当的case之前,所有分支都要进行评估;因此,在失败的分支中发出的您不打算被探索的警告是有争议的,有两种方法
1.切换到一个条件机制,它不通过计算所有内容来工作,例如base::ifelse函数

  1. Package 可能失败/错误/警告的函数,以便在使用case_when时抑制失败消息。例如{purrr}封装提供了方便的封装功能;安静地、安全地、可能地等。

相关问题