Hoe moet worden vermijd waarschuwing bij het introduceren van NAS door dwang

Ik heb er in het algemeen liever RO, zodat ik geen waarschuwingen krijg, maar ik weet niet hoe ik moet voorkomen dat ik een waarschuwing krijg bij gebruik van as.numericom een ​​tekenvector te converteren.

Bijvoorbeeld:

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

zal me een waarschuwing geven omdat het NAS door dwang geïntroduceerde. Ik wil NAS geïntroduceerd door dwang – is er een manier om het te vertellen “Ja, dit is wat ik wil doen”. Of moet ik gewoon bij de waarschuwing wonen?

of moet ik een andere functie gebruiken voor deze taak?


Antwoord 1, Autoriteit 100%

Gebruik suppressWarnings():

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

Hiermee wordt waarschuwingen onderdrukt.


Antwoord 2, Autoriteit 25%

suppressWarnings()is al genoemd. Een alternatief is om de problematische personages handmatig naar NA te converteren. Voor uw specifieke probleem, taRifx::destringDoet DAT. Op deze manier als u een andere, onverwachte waarschuwing uit uw functie krijgt, wordt deze niet onderdrukt.

> 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

Antwoord 3, Autoriteit 19%

In het algemeen onderdrukkende waarschuwingen is niet de beste oplossing, omdat u misschien gewaarschuwd wilt wanneer er een onverwachte input wordt verstrekt.
Oplossing hieronder is Wrapper voor het handhaven van slechts NA tijdens de conversie van het gegevenstype. Vereist geen pakket.

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

Antwoord 4

Ik heb de functie jangoreckienigszins aangepast voor het geval we verschillende waarden hebben die niet kunnen worden omgezet naar een getal. In mijn functie wordt een sjabloonzoekopdracht uitgevoerd en als de sjabloon niet wordt gevonden, wordt FALSE geretourneerd.! vóór gperl betekent dit dat we die vectorelementen nodig hebben die niet overeenkomen met de sjabloon. De rest is vergelijkbaar met de functie as.num. Voorbeeld:

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

Other episodes