Làm thế nào để tránh cảnh báo khi giới thiệu NA bằng cách ép buộc


124

Tôi thường thích mã R để tôi không nhận được cảnh báo, nhưng tôi không biết làm thế nào để tránh bị cảnh báo khi sử dụng as.numericđể chuyển đổi một vectơ ký tự.

Ví dụ:

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

Sẽ cho tôi một cảnh báo vì nó giới thiệu NA bằng cách ép buộc. Tôi muốn các NA được giới thiệu bằng cách ép buộc - có cách nào để nói với nó "vâng đây là điều tôi muốn làm". Hay tôi chỉ nên sống với cảnh báo?

Hay tôi nên sử dụng một chức năng khác cho nhiệm vụ này?


8
Thấy ?suppressWarningscó lẽ?
A5C1D2H2I1M1N2O1R2T1

4
Vấn đề với cảnh báo này là gì? Nói chung nó cung cấp thông tin có giá trị. Tôi thích một đầu ra dài dòng hơn trong bảng điều khiển R cho những bất ngờ khó chịu.
Roland

12
@Roland Tôi hoàn toàn đồng ý, nhưng tính hữu ích của các cảnh báo sẽ giảm nếu bạn quen với việc bỏ qua chúng. Đó là lý do tại sao tôi thường thích "giải quyết" các cảnh báo. Trong trường hợp này, tôi sẽ LUÔN tạo ra các cảnh báo và rất nhiều trong số đó - dữ liệu của tôi xuất hiện dưới dạng các chuỗi có chữ "X" đại diện cho NA, và do đó, hàm đang thực hiện chính xác những gì tôi muốn. Tôi muốn nói "Cảm ơn vì đã cho tôi biết, nhưng tôi biết mình đang làm gì". suppressWarningscó vẻ hoàn hảo
Korone

6
Bạn biết rằng read.tablechấp nhận một cuộc tranh cãi na.strings?
Roland

Thật hữu ích để loại bỏ chúng nếu bạn đã khắc phục một lỗi đã biết trong thư viện. Đó là cách tôi sẽ sử dụng cái này!
Clem Wang

Câu trả lời:


142

Sử dụng suppressWarnings():

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

Điều này ngăn chặn cảnh báo.


Mặc dù đây là câu trả lời ưa thích, nhưng câu trả lời của jangorecki dưới đây dường như, đối với tôi, vững chắc hơn.
Ian

34

suppressWarnings()đã được đề cập. Một cách khác là chuyển đổi thủ công các ký tự có vấn đề sang NA trước. Đối với vấn đề cụ thể của bạn, taRifx::destringchỉ cần điều đó. Bằng cách này nếu bạn nhận được một số cảnh báo bất ngờ khác ngoài chức năng của mình, nó sẽ không bị chặn.

> 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

2
Tôi biết đây là một chủ đề cũ và destringhoạt động hoàn hảo cho ví dụ của op, nhưng một điều lưu ý cho bất kỳ ai nhìn thấy chủ đề này trong tương lai là destringhoạt động khác với as.numerickhi chuỗi mục tiêu là hỗn hợp của chuỗi và số: nghĩa là destring("x1")cho 1nhưng as.numeric("x1")choNA
Hồng

26

Nói chung, cảnh báo triệt tiêu không phải là giải pháp tốt nhất vì bạn có thể muốn được cảnh báo khi một số đầu vào bất ngờ sẽ được cung cấp.
Giải pháp dưới đây là trình bao bọc để duy trì NA trong quá trình chuyển đổi kiểu dữ liệu. Không yêu cầu bất kỳ gói.

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
Đây là câu trả lời tốt nhất. Sử dụng suppressWarnings()nói chung là một ý tưởng tồi, bởi vì đôi khi chúng ta cần phải xem những cảnh báo đó.
keberwein

0

Tôi đã sửa đổi một chút hàm jangorecki cho trường hợp chúng ta có thể có nhiều giá trị không thể chuyển đổi thành số. Trong chức năng của tôi, tìm kiếm mẫu được thực hiện và nếu không tìm thấy mẫu, FALSE được trả về.! trước gperl, điều đó có nghĩa là chúng ta cần những phần tử vectơ không khớp với mẫu. Phần còn lại tương tự như as.numchức năng. Thí dụ:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.