Come evitare gli avvertimenti quando si introducono le NA per coercizione


124

In genere preferisco codificare R in modo da non ricevere avvisi, ma non so come evitare di ricevere un avviso quando si utilizza as.numericper convertire un vettore di caratteri.

Per esempio:

x <- as.numeric(c("1", "2", "X"))

Mi darà un avvertimento perché ha introdotto le NA per coercizione. Voglio che le NA siano introdotte per coercizione - c'è un modo per dirgli "sì, questo è quello che voglio fare". O dovrei semplicemente vivere con l'avvertimento?

O dovrei usare una funzione diversa per questa attività?


8
Vedi ?suppressWarningsforse?
A5C1D2H2I1M1N2O1R2T1

4
Qual è il problema con questo avviso? Generalmente fornisce informazioni preziose. Preferisco un output più dettagliato nella console R alle brutte sorprese.
Roland

12
@Roland Sono totalmente d'accordo, ma l'utilità degli avvertimenti diminuisce se ti abitui a ignorarli. Ecco perché generalmente mi piace "affrontare" gli avvertimenti. In questo caso, genererò SEMPRE avvisi, e molti di essi: i miei dati arrivano come stringhe con una "X" che rappresenta NA, e quindi la funzione sta facendo esattamente quello che voglio che faccia. Volevo dire "Grazie per avermelo informato, ma va bene lo so cosa sto facendo". suppressWarningssembra perfetto.
Korone

6
Sai che read.tableaccetta una discussione na.strings?
Roland

È utile sopprimerli se hai già una soluzione a un bug noto in una libreria. È così che lo userò!
Clem Wang

Risposte:


142

Usa suppressWarnings():

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

Questo sopprime gli avvisi.


Sebbene questa sia la risposta preferita, la risposta di jangorecki di seguito sembra, a me, più solida.
Ian

34

suppressWarnings()è già stato menzionato. Un'alternativa è convertire prima manualmente i caratteri problematici in NA. Per il tuo problema particolare, taRifx::destringfa proprio questo. In questo modo, se ottieni qualche altro avviso inaspettato dalla tua funzione, non verrà soppresso.

> 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

3
So che questo è un vecchio thread e destringfunziona perfettamente per l'esempio di op, ma un avvertimento per chiunque veda questo thread in futuro è che destringfunziona in modo diverso da as.numericquando la stringa di destinazione è una miscela di stringa e numerica: cioè destring("x1")1ma as.numeric("x1")NA
Hong

26

In generale, la soppressione degli avvisi non è la soluzione migliore in quanto potresti voler essere avvisato quando verrà fornito un input imprevisto.
La soluzione seguente è il wrapper per mantenere solo NA durante la conversione del tipo di dati. Non richiede alcun pacchetto.

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

4
Questa è la migliore risposta. L'utilizzo suppressWarnings()è generalmente una cattiva idea, perché a volte abbiamo bisogno di vedere questi avvisi.
keberwein

0

Ho leggermente modificato la funzione jangorecki per il caso in cui potremmo avere una varietà di valori che non possono essere convertiti in un numero. Nella mia funzione, viene eseguita una ricerca del modello e se il modello non viene trovato, viene restituito FALSE.! prima di gperl, significa che abbiamo bisogno di quegli elementi vettoriali che non corrispondono al modello. Il resto è simile alla as.numfunzione. Esempio:

as.num.pattern <- function(x, pattern){
  stopifnot(is.character(x))
  na = !grepl(pattern, x)
  x[na] = -Inf
  x = as.numeric(x)
  x[na] = NA_real_
  x
}

as.num.pattern(c('1', '2', '3.43', 'char1', 'test2', 'other3', '23/40', '23, 54 cm.'))

[1] 1.00 2.00 3.43   NA   NA   NA   NA   NA
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.