dplyr::case_when 会抛出“无非缺失参数”且 na.rm=TRUE,即使在补偿所有 NA 情况时也是如此

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

我正在尝试计算行间的最小值,同时补偿所有感兴趣的值均为 NA 的行:

library(dplyr)

testDf <- tibble(a = 1:4,
                 b = c(NA, 5:7),
                 c = c(NA, 8, NA, 10),
                 d = c(NA, 11:13)
                 ) %>%
  rowwise() %>%
  mutate(e = case_when(all(is.na(c_across(b:d))) ~ NA_integer_,
                       .default = min(c_across(b:d), na.rm=TRUE))
         ) %>%
  ungroup()

我在第 1 行收到以下警告:

min()
中的警告引起:! min 没有非缺失参数;返回信息

但是,输出表明代码按预期工作:

testDf

# A tibble: 4 × 5
      a     b     c     d     e
  <int> <int> <dbl> <int> <dbl>
1     1    NA    NA    NA    NA
2     2     5     8    11     5
3     3     6    NA    12     6
4     4     7    10    13     7

e 列第一行有

NA
,第三行有 6,并且没有
Inf
值。我尝试将
.default =
替换为
TRUE ~
!all(is.na(c_across(b:d))) ~
,以及将
NA_integer_
替换为
NA_real_
,但仍然收到相同的警告。

我的理解是,

.default
中的
case_when
仅适用于上一个方程的左侧返回FALSE或NA时。使用以下命令进行测试确实对于 f 的第一行产生 TRUE,对于其余的则产生 FALSE,因此看起来
.default
行右侧的操作应该跳过第一行:

testDf %>%
  rowwise() %>%
  mutate(f = all(is.na(c_across(b:d))))

# A tibble: 4 × 6
# Rowwise: 
      a     b     c     d     e f    
  <int> <int> <dbl> <int> <dbl> <lgl>
1     1    NA    NA    NA    NA TRUE 
2     2     5     8    11     5 FALSE
3     3     6    NA    12     6 FALSE
4     4     7    10    13     7 FALSE

我不喜欢在一般情况下抑制警告,尤其是在似乎没有出现问题的情况下。似乎无法确定我哪里出了问题或者这只是一个错误。

r dplyr
1个回答
0
投票

我相信错误消息是正确的。

case)_when
在“决定”返回哪个值之前评估所有可能的值。您以
min
方式将
c
应用于列
d
rowwise
。 有些行的这些列中有
NA
。 因此,
case_when
尝试评估这些行的
min(NA, na.rm = TRUE)
并报告这些中间值的错误。 但随后
case_when
应用其逻辑来确定 最终 结果。

为了避免出现错误消息,您可以切换到

ifelse
,它会延迟计算其参数:

testDf <- tibble(
  a = 1:4,
  b = c(NA, 5:7),
  c = c(NA, 8, NA, 10),
  d = c(NA, 11:13)
) %>%
rowwise() %>%
mutate(
  e = ifelse(
    all(is.na(c_across(b:d))), 
    NA_integer_,
    min(c_across(b:d), na.rm=TRUE)
  )
) %>%
ungroup()
© www.soinside.com 2019 - 2024. All rights reserved.