Как правильно обрабатывать предупреждение о принуждении NA - PullRequest
0 голосов
/ 05 августа 2020

Я хочу преобразовать столбец из символа в число c. Некоторые значения не могут быть преобразованы. Это приводит к предупреждению, которое является ожидаемым поведением.

data.frame(a=c("5","7","not_a_number"),stringsAsFactors = F) %>% mutate(value=as.numeric(a))

Кроме того, у меня есть еще один столбец, дающий мне информацию, какие строки могут быть преобразованы в numeri c (логический). Я хочу использовать этот столбец, чтобы R мог быть уверен, что он не должен принудительно.

data.frame(a=c("5","7","not_a_number"),b=c(1,1,0),stringsAsFactors = F) %>% 
mutate(value=ifelse(b,as.numeric(a),NA_integer_))

Но это дает ту же ошибку. Зачем? Здесь ни к чему не принуждать. Я отвечаю за правильный и совместимый тип в строках. Что происходит?

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Вам необходимо применить as.numeric за пределами ifelse:

library(dplyr)
df %>% mutate(value = as.numeric(ifelse(b,a,NA)))

#             a b value
#1            5 1     5
#2            7 1     7
#3 not_a_number 0  <NA>

, где df - это:

df <- data.frame(a=c("5","7","not_a_number"),b=c(1,1,0),stringsAsFactors = FALSE) 
0 голосов
/ 05 августа 2020

Косвенный ответ, почему бы не удалить все нецифровые цифры перед преобразованием в числа c:

data.frame(a = c("5","7","not_a_number"), stringsAsFactors = FALSE) %>%
  mutate(value = as.numeric(gsub("\\D+", "", a)))
#              a value
# 1            5     5
# 2            7     7
# 3 not_a_number    NA
...