web-dev-qa-db-fra.com

Comment éviter les avertissements lors de l'entrée forcée de NA

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?

94
Corone

Utilisez suppressWarnings():

suppressWarnings(as.numeric(c("1", "2", "X")))
[1]  1  2 NA

Cela supprime les avertissements.

118
Andrie

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
29
Ari B. Friedman

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
15
jangorecki

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()
0
DJV

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()

0
T.M