NA'ları zorlayarak tanıtırken uyarıdan nasıl kaçınılır


124

Genelde uyarı almamak için R kodlamayı tercih ederim, ancak kullanırken uyarı almaktan nasıl kaçınacağımı bilmiyorum as.numeric bir karakter vektörünü dönüştürmek için .

Örneğin:

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

NA'ları zorlayarak tanıttığı için bana bir uyarı verecek. NA'ların zorlama yoluyla tanıtılmasını istiyorum - ona "evet, yapmak istediğim şey bu" demenin bir yolu var mı? Yoksa sadece uyarı ile yaşamalı mıyım?

Yoksa bu görev için farklı bir işlev mi kullanmalıyım?


8
Bkz ?suppressWarningsbelki?
A5C1D2H2I1M1N2O1R2T1

4
Bu uyarıdaki sorun nedir? Genellikle değerli bilgiler verir. R konsolunda daha ayrıntılı bir çıktıyı kötü sürprizlere tercih ederim.
Roland

12
@Roland tamamen katılıyorum, ancak onları görmezden gelmeye alışırsanız uyarıların faydası azalır. Bu yüzden genellikle uyarıları "ele almayı" seviyorum. Bu durumda, HER ZAMAN uyarılar üreteceğim ve bunların çoğu - verilerim "X" NA'yı temsil eden dizeler olarak geliyor ve bu nedenle işlev tam olarak yapmasını istediğim şeyi yapıyor. "Haber verdiğin için teşekkürler, ama sorun değil, ne yaptığımı biliyorum" demek istedim. suppressWarningsmükemmel görünüyor.
Korone

6
Bunun read.tablebir tartışmayı kabul ettiğini biliyor musun na.strings?
Roland

Bir kitaplıktaki bilinen bir hataya zaten bir çalışmanız varsa, bunları bastırmak yararlıdır. Ben bunu böyle kullanacağım!
Clem Wang

Yanıtlar:


142

Kullanım suppressWarnings():

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

Bu uyarıları bastırır.


Tercih edilen yanıt bu olsa da, aşağıdaki jangorecki'nin cevabı bana daha sağlam görünüyor.
Ian

34

suppressWarnings()zaten bahsedildi. Bir alternatif, önce sorunlu karakterleri manuel olarak NA'ya dönüştürmektir. Özel probleminiz için, taRifx::destringsadece bunu yapar. Bu şekilde, işlevinizden beklenmedik başka bir uyarı alırsanız, bastırılmayacaktır.

> 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
Bunun eski bir iş parçacığı olduğunu ve destringoperasyon örneği için mükemmel bir şekilde çalıştığını biliyorum , ancak gelecekte bu diziyi gören herkes için bir uyarı , hedef dizenin bir dizi ve sayısal bir karışım olduğu zamandan destringfarklı şekilde çalışmasıdır as.numeric: yani, destring("x1")verir 1ama as.numeric("x1")verirNA
Hong

26

Genel olarak, bazı beklenmedik girdiler sağlandığında uyarılmak isteyebileceğinizden uyarıları bastırmak en iyi çözüm değildir.
Aşağıdaki çözüm, veri türü dönüşümü sırasında yalnızca NA'yı korumak için bir sarmalayıcıdır. Herhangi bir paket gerektirmez.

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
Bu en iyi cevap. Kullanmak suppressWarnings()genellikle kötü bir fikirdir çünkü bazen bu uyarıları görmemiz gerekir.
keberwein

0

Bir sayıya dönüştürülemeyen çeşitli değerlere sahip olabileceğimiz durum için jangorecki işlevini biraz değiştirdim . Benim fonksiyonumda bir şablon araması yapılır ve eğer şablon bulunmazsa FALSE döndürülür.! gperl'den önce, şablonla eşleşmeyen vektör öğelerine ihtiyacımız olduğu anlamına gelir. Gerisi as.numişleve benzer . Misal:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.