我有许多缺失值的数据,我想计算所有非缺失值的每行的最大值。我使用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。
我错过了什么?如何把上面写得更“美”?
我很高兴任何建议!谢谢你!
2条答案
按热度按时间lrl1mhuk1#
使用
pmax
:输出:
bfnvny8b2#
case_when
的文档明确指出,在选择适当的case之前,所有分支都要进行评估;因此,在失败的分支中发出的您不打算被探索的警告是有争议的,有两种方法1.切换到一个条件机制,它不通过计算所有内容来工作,例如
base::ifelse
函数{purrr}
封装提供了方便的封装功能;安静地、安全地、可能地等。