我尝试从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
请帮助我理解为什么我的脚本仍然试图将字符值转换为数字,以及如何修复这个问题。
1条答案
按热度按时间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))
的警告。