วิธีหลีกเลี่ยงคำเตือนเมื่อแนะนำ NAs โดยการบีบบังคับ


124

โดยทั่วไปฉันชอบเขียนโค้ด R เพื่อที่จะไม่ได้รับคำเตือน แต่ฉันไม่รู้วิธีหลีกเลี่ยงการรับคำเตือนเมื่อใช้as.numericเพื่อแปลงเวกเตอร์อักขระ

ตัวอย่างเช่น:

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

จะให้คำเตือนเพราะแนะนำ NAs โดยการบีบบังคับ ฉันต้องการให้ NAs แนะนำโดยการบีบบังคับ - มีวิธีที่จะบอกได้ไหมว่า "ใช่นี่คือสิ่งที่ฉันต้องการทำ" หรือฉันควรอยู่กับคำเตือน?

หรือฉันควรใช้ฟังก์ชันอื่นสำหรับงานนี้


8
เห็น?suppressWarningsไหม?
A5C1D2H2I1M1N2O1R2T1

4
คำเตือนนี้มีปัญหาอะไร โดยทั่วไปจะให้ข้อมูลที่มีค่า ฉันชอบเอาต์พุตแบบละเอียดมากกว่าในคอนโซล R เพื่อเซอร์ไพรส์ที่น่ารังเกียจ
Roland

12
@Roland ฉันเห็นด้วยอย่างยิ่ง แต่ประโยชน์ของคำเตือนจะลดน้อยลงหากคุณเคยชินกับการเพิกเฉยต่อสิ่งเหล่านี้ นั่นเป็นเหตุผลที่ฉันมักจะ "จัดการ" คำเตือน ในกรณีนี้ฉันจะสร้างคำเตือนเสมอและจำนวนมาก - ข้อมูลของฉันมาในรูปแบบสตริงโดยมี "X" แทน NA ดังนั้นฟังก์ชันจึงทำในสิ่งที่ฉันต้องการให้ทำ ฉันอยากจะบอกว่า "ขอบคุณที่แจ้งให้ฉันทราบ แต่ฉันก็รู้ว่ากำลังทำอะไรอยู่" suppressWarningsดูเหมือนสมบูรณ์แบบ
Korone

6
คุณรู้ว่าread.tableยอมรับการโต้แย้งna.strings?
Roland

เป็นประโยชน์ในการระงับพวกเขาหากคุณมีวิธีแก้ไขข้อบกพร่องที่ทราบแล้วในไลบรารี นั่นคือสิ่งที่ฉันจะใช้!
Clem Wang

คำตอบ:


142

ใช้suppressWarnings():

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

ซึ่งจะระงับคำเตือน


แม้ว่านี่จะเป็นคำตอบที่ต้องการ แต่คำตอบของ jangorecki ด้านล่างดูเหมือนว่าสำหรับฉันจะมั่นคงกว่า
Ian

34

suppressWarnings()ได้รับการกล่าวถึงแล้ว อีกทางเลือกหนึ่งคือการแปลงอักขระที่มีปัญหาเป็น NA ด้วยตนเองก่อน สำหรับปัญหาเฉพาะของคุณให้taRifx::destringทำเช่นนั้น ด้วยวิธีนี้หากคุณได้รับคำเตือนอื่น ๆ ที่ไม่คาดคิดจากฟังก์ชันของคุณจะไม่ถูกระงับ

> 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
ฉันรู้ว่านี่เป็นเธรดเก่าและdestringทำงานได้อย่างสมบูรณ์แบบสำหรับตัวอย่างของ op แต่ข้อแม้อย่างหนึ่งสำหรับทุกคนที่เห็นเธรดนี้ในอนาคตคือการdestringทำงานแตกต่างจากas.numericเมื่อสตริงเป้าหมายเป็นส่วนผสมของสตริงและตัวเลขนั่นคือdestring("x1")ให้1แต่as.numeric("x1")ให้NA
Hong

26

โดยทั่วไปการระงับคำเตือนไม่ใช่วิธีแก้ปัญหาที่ดีที่สุดเนื่องจากคุณอาจต้องการได้รับคำเตือนเมื่อมีการป้อนข้อมูลที่ไม่คาดคิด
โซลูชันด้านล่างคือ Wrapper สำหรับการดูแลเฉพาะ NA ระหว่างการแปลงประเภทข้อมูล ไม่ต้องใช้แพ็คเกจใด ๆ

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
นี่คือคำตอบที่ดีที่สุด การใช้suppressWarnings()โดยทั่วไปเป็นความคิดที่ไม่ดีเพราะบางครั้งเราจำเป็นต้องดูคำเตือนเหล่านั้น
keberwein

0

ฉันได้แก้ไขฟังก์ชันjangoreckiเล็กน้อยสำหรับกรณีที่เราอาจมีค่าต่างๆที่ไม่สามารถแปลงเป็นตัวเลขได้ ในฟังก์ชันของฉันการค้นหาเทมเพลตจะดำเนินการและหากไม่พบเทมเพลตจะส่งคืน FALSE! ก่อน gperl หมายความว่าเราต้องการองค์ประกอบเวกเตอร์ที่ไม่ตรงกับเทมเพลต ส่วนที่เหลือคล้ายกับas.numฟังก์ชัน ตัวอย่าง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.