Bagaimana menghindari peringatan saat memperkenalkan NAs dengan paksaan

124

Saya biasanya lebih suka kode R sehingga saya tidak mendapatkan peringatan, tetapi saya tidak tahu bagaimana menghindari peringatan saat menggunakan as.numericuntuk mengonversi vektor karakter.

Sebagai contoh:

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

Akan memberi saya peringatan karena memperkenalkan NAs dengan paksaan. Saya ingin NAs diperkenalkan dengan paksaan - apakah ada cara untuk mengatakannya "ya ini yang ingin saya lakukan". Atau haruskah saya hidup dengan peringatan itu?

Atau haruskah saya menggunakan fungsi yang berbeda untuk tugas ini?

Korone
sumber
8
Lihat ?suppressWarningsmungkin?
A5C1D2H2I1M1N2O1R2T1
4
Apa masalah dengan peringatan ini? Umumnya memberikan informasi yang berharga. Saya lebih suka output yang lebih bertele-tele di konsol R daripada kejutan yang tidak menyenangkan.
Roland
12
@Roland Saya sangat setuju, tetapi kegunaan peringatan berkurang jika Anda terbiasa mengabaikannya. Itulah mengapa saya biasanya suka "menangani" peringatan tersebut. Dalam hal ini, saya akan SELALU menghasilkan peringatan, dan banyak di antaranya - data saya masuk sebagai string dengan "X" yang mewakili NA, sehingga fungsinya melakukan persis seperti yang saya inginkan. Saya ingin mengatakan "Terima kasih telah memberi tahu saya, tetapi tidak apa-apa, saya tahu apa yang saya lakukan". suppressWarningstampak sempurna.
Korone
6
Anda tahu bahwa read.tablemenerima argumen na.strings?
Roland
Ini berguna untuk menekan mereka jika Anda sudah memiliki solusi untuk bug yang dikenal di perpustakaan. Begitulah cara saya menggunakan ini!
Clem Wang

Jawaban:

142

Penggunaan suppressWarnings():

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

Ini menekan peringatan.

Andrie
sumber
Meskipun ini adalah jawaban yang disukai, jawaban jangorecki di bawah ini menurut saya lebih solid.
Ian
34

suppressWarnings()telah disebutkan. Alternatifnya adalah mengonversi karakter bermasalah ke NA terlebih dahulu secara manual. Untuk masalah khusus Anda, taRifx::destringlakukan hanya itu. Dengan cara ini jika Anda mendapatkan peringatan lain yang tidak terduga dari fungsi Anda, itu tidak akan dimatikan.

> 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
sumber
3
Saya tahu ini adalah utas lama dan destringberfungsi dengan sempurna untuk contoh op, tetapi satu peringatan bagi siapa pun yang melihat utas ini di masa depan adalah yang destringbekerja secara berbeda dari as.numericketika string target adalah campuran string dan numerik: yaitu, destring("x1")memberi 1tetapi as.numeric("x1")memberiNA
Hong
26

Secara umum, menekan peringatan bukanlah solusi terbaik karena Anda mungkin ingin diperingatkan ketika beberapa masukan yang tidak diharapkan akan diberikan.
Solusi di bawah ini adalah pembungkus untuk mempertahankan hanya NA selama konversi tipe data. Tidak memerlukan paket apa pun.

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
sumber
4
Inilah jawaban terbaik. Menggunakan suppressWarnings()umumnya merupakan ide yang buruk, karena terkadang kita perlu melihat peringatan tersebut.
keberwein
0

Saya telah sedikit memodifikasi fungsi jangorecki untuk kasus di mana kita mungkin memiliki berbagai nilai yang tidak dapat diubah menjadi angka. Dalam fungsi saya, pencarian template dilakukan dan jika template tidak ditemukan, FALSE dikembalikan.! sebelum gperl, itu berarti kita membutuhkan elemen vektor yang tidak cocok dengan template. Selebihnya mirip as.numfungsinya. Contoh:

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
sumber