벡터에서 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
'programing' 카테고리의 다른 글
| 플라스크 가져오기 오류: 플라스크라는 모듈 없음 (0) | 2023.06.20 |
|---|---|
| 오라클에서 절차의 정의를 인쇄하는 방법은 무엇입니까? (0) | 2023.06.20 |
| SQL 쿼리에서 SQL Server 열에 하나(+1)를 추가하는 방법 (0) | 2023.06.20 |
| 오라클의 LOB 세그먼트(SYS_LOB)를 이해하시겠습니까? (0) | 2023.06.20 |
| rbindlist가 rbind보다 "더 나은" 이유는 무엇입니까? (0) | 2023.06.20 |