벡터에서 NA 값 제거


191

나는 두 개의 NA값 을 가진 거대한 벡터를 가지고 있으며 그 벡터에서 최대 값을 찾으려고 노력하고 있지만 (벡터는 모든 숫자입니다) NA값 때문에이 작업을 수행 할 수 없습니다 .

NA최대 값을 계산할 수 있도록 값을 제거하려면 어떻게 해야합니까?

답변:


265

을 시도 ?max하면 실제로 na.rm =기본적으로로 설정된 인수 가 있음을 알 수 FALSE있습니다. (즉 포함한 다른 많은 R 기능에 대한 공통 기본이다 sum(), mean()등)

설정 na.rm=TRUE은 원하는 것을 수행합니다.

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

모든을 제거 NA하려면 대신이 관용구를 사용하십시오.

d <- d[!is.na(d)]

마지막 주 : 다른 기능 (예를 들어 table(), lm()sort())가 NA서로 다른 이름을 사용 (다른 옵션을 제공합니다) - 관련 인수를. 따라서 NA함수 호출에서 문제가 발생하면 함수의 인수 중 내장 솔루션을 확인하는 것이 좋습니다. 나는 일반적으로 이미 존재하는 것을 발견 했다.


이것은 매우 나쁜 생각입니다. 그것은 실패하고 있습니다 -InfA에 대한 d모든 NAS의.
user3932000

@ user3932000 다른 사람들을 위해, 당신의 불만은 실제로 기본 R 기능 max()이 어떻게 동작하는지에 관한 것입니다 (예를 들어, 수행 할 때 max(c(NA, NA)). 개인적으로는 그 행동이 합리적이라고 생각합니다. 나는 그것이 건설되었다 기대하는 그런 일을 할 때 예상되는 결과를 얻을 방법 있도록a <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
조쉬 오브라이언

@ user3932000은 다소 접선, 데이터 분석 플랫폼으로 R의 많은 장점 중 하나는 누락 된 데이터의 정교한 처리의 결과 많은 그 저자의 부분에주의 생각. (이 주제에 관심이 있으시면 Python의 우수한 NumPy 패키지 에 R과 같은 처리 기능을 통합하는 데 참여한 프로그래머의 관점에서 관련된 몇 가지 문제에 대한 좋은 토론을 보려면 여기참조하십시오 .NA
Josh 오브라이언

@ user3932000 : 그 대답은 정말 나쁩니 까? 널 세트의 최대 값을 어떻게 생각하십니까?
Cliff AB

@CliffAB 최대 값이 없습니다. 최대 값을 -∞ (및 최소값 + ∞)로 지정할 수 있지만 항상 바람직하거나 직관적 인 것은 아닙니다. 또한 NA의 벡터에서 모든을 제거 NA하면 -∞이 아닌 빈 벡터가 필요합니다.
3932000

94

na.omit기능은 많은 회귀 루틴이 내부적으로 사용하는 것입니다.

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000

20

?maxna.rm설정할 수 있는 추가 매개 변수가 있음을 나타 TRUE냅니다.

그 외에도 s 를 정말로 제거 NA하려면 다음과 같이 사용하십시오.

myvec[!is.na(myvec)]

3
나는 이것이 최선이라고 생각합니다. na.rm 및 na.omit은 출력에 약간의 정크를 추가합니다.
MadmanLee

na.omit데이터 프레임 방법도 제외하고 더 일반적입니다.
IRTFM 2019

15

에 전화 할 수 있습니다 max(vector, na.rm = TRUE). 보다 일반적으로이 na.omit()기능을 사용할 수 있습니다 .


14

R을 처음 접하는 사람이 원래 질문에 대한 간단한 답변을 원할 경우

벡터에서 NA 값을 제거하려면 어떻게해야합니까?

여기있어:

foo다음과 같이 벡터가 있다고 가정하십시오 .

foo = c(1:10, NA, 20:30)

러닝 length(foo)은 22를 제공합니다.

nona_foo = foo[!is.na(foo)]

length(nona_foo) NA 값이 제거되었으므로 21입니다.

기억 is.na(foo)은 부울 행렬을 반환하므로이 foo값과 반대로 인덱싱 하면 NA가 아닌 모든 요소가 제공됩니다.


13

purrrdiscard 에서 사용 (목록 및 벡터와 함께 작동)

discard(v, is.na) 

장점은 파이프를 사용하기 쉽다는 것입니다. 또는 내장 서브 셋팅 기능을 사용하십시오 [:

v %>% discard(is.na)
v %>% `[`(!is.na(.))

참고 na.omit목록에서 작동하지 않습니다 :

> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1

$b
[1] 2

$c
[1] NA

1

두 가지 base접근 방식을 비교하는 빠른 벤치 마크를 실행했으며 x[!is.na(x)]그보다 빠릅니다 na.omit. 사용자 qwr는 나도 시도해 보라고 제안했다. purrr::dicard이것은 상당히 느려졌다.

microbenchmark::microbenchmark(
  purrr::map(airquality,function(x) {x[!is.na(x)]}), 
  purrr::map(airquality,na.omit),
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
  times = 1e6)

Unit: microseconds
                                                     expr    min     lq      mean median      uq       max neval cld
 purrr::map(airquality, function(x) {     x[!is.na(x)] })   66.8   75.9  130.5643   86.2  131.80  541125.5 1e+06 a  
                          purrr::map(airquality, na.omit)   95.7  107.4  185.5108  129.3  190.50  534795.5 1e+06  b 
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06   c

참고로 다음은 원래 x[!is.na(x)]vs 테스트입니다 na.omit.

microbenchmark::microbenchmark(
    purrr::map(airquality,function(x) {x[!is.na(x)]}), 
    purrr::map(airquality,na.omit), 
    times = 1000000)


Unit: microseconds
                                              expr  min   lq      mean median    uq      max neval cld
 map(airquality, function(x) {     x[!is.na(x)] }) 53.0 56.6  86.48231   58.1  64.8 414195.2 1e+06  a 
                          map(airquality, na.omit) 85.3 90.4 134.49964   92.5 104.9 348352.8 1e+06   b

당신은 시도해야purrr:discard
qwr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.