So vermeiden Sie Warnungen bei der Einführung von NAs durch Zwang

124

Ich bevorzuge es im Allgemeinen, R zu codieren, damit ich keine Warnungen erhalte, aber ich weiß nicht, wie ich vermeiden kann, eine Warnung zu erhalten, wenn ich as.numericeinen Zeichenvektor konvertiere.

Beispielsweise:

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

Ich werde gewarnt, weil es NAs durch Zwang eingeführt hat. Ich möchte, dass NAs durch Zwang eingeführt werden - gibt es eine Möglichkeit, es zu sagen "Ja, das ist, was ich tun möchte". Oder soll ich nur mit der Warnung leben?

Oder sollte ich für diese Aufgabe eine andere Funktion verwenden?

Korone
quelle
8
Sehen Sie ?suppressWarningsvielleicht?
A5C1D2H2I1M1N2O1R2T1
4
Was ist das Problem mit dieser Warnung? Im Allgemeinen gibt es wertvolle Informationen. Ich bevorzuge eine ausführlichere Ausgabe in der R-Konsole gegenüber bösen Überraschungen.
Roland
12
@ Roland Ich stimme vollkommen zu, aber die Nützlichkeit von Warnungen nimmt ab, wenn Sie sich daran gewöhnen, sie einfach zu ignorieren. Deshalb gehe ich die Warnungen im Allgemeinen gerne "an". In diesem Fall werde ich IMMER Warnungen generieren, und viele davon - meine Daten werden als Zeichenfolgen mit "X" als NA eingegeben, sodass die Funktion genau das tut, was ich möchte. Ich wollte sagen "Danke, dass du mich informiert hast, aber es ist in Ordnung, dass ich weiß, was ich tue". suppressWarningsscheint perfekt zu sein.
Korone
6
Sie wissen, dass read.tableein Argument akzeptiert na.strings?
Roland
Es ist nützlich, sie zu unterdrücken, wenn Sie bereits einen bekannten Fehler in einer Bibliothek behoben haben. So werde ich das nutzen!
Clem Wang

Antworten:

142

Verwendung suppressWarnings():

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

Dies unterdrückt Warnungen.

Andrie
quelle
Obwohl dies die bevorzugte Antwort ist, scheint mir die Antwort von jangorecki unten solider zu sein.
Ian
34

suppressWarnings()wurde bereits erwähnt. Eine Alternative besteht darin, die problematischen Zeichen zuerst manuell in NA zu konvertieren. taRifx::destringTut genau das für Ihr spezielles Problem . Auf diese Weise wird Ihre Funktion nicht unterdrückt, wenn Sie eine andere, unerwartete Warnung erhalten.

> 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
Ari B. Friedman
quelle
2
Ich weiß, dass dies ein alter Thread ist und destringperfekt für das Beispiel von op funktioniert, aber eine Einschränkung für jeden, der diesen Thread in Zukunft sieht, ist, dass er destringanders funktioniert, as.numericals wenn die Zielzeichenfolge eine Mischung aus Zeichenfolge und numerisch ist: das heißt, destring("x1")gibt 1aber as.numeric("x1")gibtNA
Hong
26

Im Allgemeinen ist das Unterdrücken von Warnungen nicht die beste Lösung, da Sie möglicherweise gewarnt werden möchten, wenn unerwartete Eingaben bereitgestellt werden.
Die folgende Lösung ist ein Wrapper, mit dem nur NA während der Datentypkonvertierung beibehalten werden kann. Benötigt kein Paket.

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
jangorecki
quelle
4
Dies ist die beste Antwort. Die Verwendung suppressWarnings()ist im Allgemeinen eine schlechte Idee, da wir diese Warnungen manchmal sehen müssen.
Keberwein
0

Ich habe die Jangorecki- Funktion für den Fall, dass wir möglicherweise eine Vielzahl von Werten haben, die nicht in eine Zahl konvertiert werden können, leicht geändert . In meiner Funktion wird eine Vorlagensuche durchgeführt und wenn die Vorlage nicht gefunden wird, wird FALSE zurückgegeben.! vor gperl bedeutet dies, dass wir die Vektorelemente benötigen, die nicht mit der Vorlage übereinstimmen. Der Rest ähnelt der as.numFunktion. Beispiel:

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
Vladislav Shufinskiy
quelle