为什么当test为FALSE时,R中的ifelse()应用函数?

qf9go6mv  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(130)

我尝试从tibble的字符列中提取数字,并使用ifelse()将其转换为数值类型,以便将as.numeric()应用于不包含字母(或“+”)的值。
当此示例正常工作时,它将返回一条警告消息:

library(dplyr)

tibble(a = c("0", "0.1", "abc")) %>% 
  mutate(b = ifelse(!grepl("[a-zA-Z\\+]+", a), as.numeric(a), NA))

# A tibble: 3 × 2
  a         b
  <chr> <dbl>
1 0       0  
2 0.1     0.1
3 abc    NA  
Warning message:
Problem while computing `b = ifelse(grepl("[a-zA-Z\\+]+", a), NA, as.numeric(a))`.
ℹ NAs introduced by coercion

请帮助我理解为什么我的脚本仍然试图将字符值转换为数字,以及如何修复这个问题。

bis0qfac

bis0qfac1#

正如这个密切相关的问题所解释的:Does ifelse really calculate both of its vectors every time?ifelse(一般情况下)计算每个条目的两个响应,然后将适当的响应放在一起放入结果向量中。因此,即使as.numeric("abc")不在结果中,它仍会尝试计算它。
这意味着在这里使用ifelse()可能没有多大意义,最好简化为b = as.numeric(a),或者如果你想避免b = suppressWarnings(as.numeric(a))的警告。

相关问题