我正在尝试计算行间的最小值,同时补偿所有感兴趣的值均为 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
我不喜欢在一般情况下抑制警告,尤其是在似乎没有出现问题的情况下。似乎无法确定我哪里出了问题或者这只是一个错误。
我相信错误消息是正确的。
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()