Je préfère généralement coder R pour ne pas recevoir d’avertissements, mais je ne sais pas comment éviter de recevoir un avertissement lors de l’utilisation de as.numeric
pour convertir un vecteur de caractères.
Par exemple:
x <- as.numeric(c("1", "2", "X"))
Me donner un avertissement parce qu'il a introduit les AN par la contrainte. Je veux que les AN soient introduites par la contrainte - existe-t-il un moyen de dire "oui, c'est ce que je veux faire". Ou devrais-je simplement vivre avec l'avertissement?
Ou devrais-je utiliser une fonction différente pour cette tâche?
Utilisez suppressWarnings()
:
suppressWarnings(as.numeric(c("1", "2", "X")))
[1] 1 2 NA
Cela supprime les avertissements.
suppressWarnings()
a déjà été mentionné. Une alternative consiste à convertir manuellement les caractères problématiques en NA. Pour votre problème particulier, taRifx::destring
fait justement cela. Ainsi, si vous recevez un autre avertissement inattendu de votre fonction, il ne sera pas supprimé.
> library(taRifx)
> x <- as.numeric(c("1", "2", "X"))
Warning message:
NAs introduced by coercion
> y <- destring(c("1", "2", "X"))
> y
[1] 1 2 NA
> x
[1] 1 2 NA
En général, la suppression des avertissements n’est pas la meilleure solution, vous voudrez peut-être être averti lorsque des informations inattendues seront fournies.
La solution ci-dessous est un wrapper permettant de ne conserver que NA pendant la conversion du type de données. Ne nécessite aucun colis.
as.num = function(x, na.strings = "NA") {
stopifnot(is.character(x))
na = x %in% na.strings
x[na] = 0
x = as.numeric(x)
x[na] = NA_real_
x
}
as.num(c("1", "2", "X"), na.strings="X")
#[1] 1 2 NA
Vous pouvez utiliser la bibliothèque stringr
.
library(tidyverse) #For piping
library(stringr) #Note: it's part of "tidyverse"
c("1", "2", "X") %>%
stringr::str_extract_all("\\(?[0-9,.]+\\)?") %>%
as.numeric()
J'ai eu le même problème avec une colonne de trame de données que je voulais utiliser pour l'axe des ordonnées d'un nuage de points ggplot2, mais voici comment je l'ai résolu:
as.numeric(as.factor(columnName))
Vous pourriez également trouver cela utile au lieu d'utiliser suppressWarnings()