programing

벡터에서 NA 값 제거

mailnote 2023. 6. 20. 21:47
반응형

벡터에서 NA 값 제거

나는 두 개의 큰 벡터를 가지고 있습니다.NA값, 그리고 저는 그 벡터에서 최대값(벡터가 모두 숫자임)을 찾으려고 하지만, 저는 이것을 할 수 없습니다.NA가치.

어떻게 제거할 수 있습니까?NA값을 계산할 수 있습니까?

괴로운?max당신은 그것이 실제로 가지고 있는 것을 보게 될 것입니다.na.rm =인수, 기본값으로 설정됨FALSE(이는 다음을 포함한 많은 다른 R 함수에 대한 일반적인 기본값입니다.sum(),mean()등)

설정na.rm=TRUE당신이 요구하는 바를 수행합니다.

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

모든 항목을 제거하려는 경우NAs, 대신 이 관용구를 사용합니다.

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

마지막 메모:기타 기능(예:table(),lm(),그리고.sort()가지고 있습니다.NA다른 이름을 사용하고 다른 옵션을 제공하는 관련 인수입니다.그래서 만약에NA함수 호출에서 문제가 발생하므로 함수의 인수 중에서 내장 솔루션을 확인할 가치가 있습니다.저는 보통 이미 거기에 하나가 있다는 것을 발견했습니다.

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

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

from purrr 사용(목록 및 벡터와 함께 작동).

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

?max추가 매개 변수가 있음을 보여줍니다.na.rm설정할 수 있습니다.TRUE.

그것과는 별개로, 만약 당신이 정말로 제거하고 싶다면.NAs, 다음과 같은 것을 사용합니다.

myvec[!is.na(myvec)]

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가 아닌 모든 요소를 얻을 수 있습니다.

전화할 수 있습니다.max(vector, na.rm = TRUE)더 일반적으로, 당신은 다음을 사용할 수 있습니다.na.omit()기능.

빠른 벤치마크를 실행하여 두 개를 비교했습니다.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)]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

다음을 사용한 다른 옵션complete.cases다음과 같이:

d <- c(1, 100, NA, 10)
result <- complete.cases(d)
output <- d[result]
output
#> [1]   1 100  10
max(output)
#> [1] 100

repref v2.0.2를 사용하여 2022-08-26에 생성됨

언급URL : https://stackoverflow.com/questions/7706876/remove-na-values-from-a-vector

반응형