강제로 NA를 도입 할 때 경고를 피하는 방법


124

일반적으로 경고를받지 않도록 R을 코딩하는 것을 선호하지만 as.numeric문자형 벡터를 변환하는 데 사용할 때 경고가 표시되지 않도록하는 방법을 모르겠습니다 .

예를 들면 :

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

강제로 NA를 도입했기 때문에 경고를 줄 것입니다. 강제로 NA를 도입하고 싶습니다. "예, 이것이 제가하고 싶은 일입니다"라고 말할 수있는 방법이 있습니까? 아니면 경고와 함께 살아야합니까?

아니면이 작업에 다른 기능을 사용해야합니까?


8
참조 ?suppressWarnings아마도?
A5C1D2H2I1M1N2O1R2T1

4
이 경고의 문제점은 무엇입니까? 일반적으로 귀중한 정보를 제공합니다. 저는 R 콘솔에서 더 자세한 출력을 선호합니다.
Roland

12
@Roland 나는 전적으로 동의하지만 경고를 무시하는 데 익숙해지면 경고의 유용성이 감소합니다. 이것이 제가 일반적으로 경고를 "처리"하는 것을 좋아하는 이유입니다. 이 경우 항상 경고를 생성하고 많은 경고를 생성합니다. 내 데이터는 "X"가 NA를 나타내는 문자열로 들어 오므로 함수는 내가 원하는대로 정확히 수행합니다. "알려 줘서 고맙지 만 내가 뭘하는지 알아도 괜찮아"라고 말하고 싶었어요. suppressWarnings완벽 해 보인다.
Korone 2013

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
나는 이것이 오래된 스레드이고 destringop의 예제에서 완벽하게 작동 한다는 것을 알고 있지만, 앞으로이 스레드를 보는 사람에게는 대상 문자열이 문자열과 숫자의 혼합 일 때와 destring다르게 작동 한다는 것입니다 as.numeric. 즉, destring("x1")제공 1하지만 as.numeric("x1")제공합니다NA
Hong

26

일반적으로 경고를 억제하는 것은 예상치 못한 입력이 제공 될 때 경고를받을 수 있으므로 최선의 해결책이 아닙니다.
아래 솔루션은 데이터 유형 변환 중에 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.