벡터에 NA가 1 개 이상 있는지 감지하는 가장 빠른 방법은 무엇입니까?
벡터의 NA
R 에 최소 1이 있는지 감지하는 가장 빠른 방법은 무엇입니까 ? 나는 사용하고있다 :
sum( is.na( data ) ) > 0
그러나이를 위해서는 각 요소, 강제 및 합계 함수를 검토해야합니다.
R 3.1.0부터는 anyNA()
이를 수행하는 방법입니다. 원자 벡터에서 이것은 전체 벡터를 통과하는 대신 첫 번째 NA 이후에 중지됩니다 any(is.na())
. 또한 이것은 is.na
즉시 폐기 되는 중간 논리 벡터를 만드는 것을 방지 합니다. Joran의 예를 빌리기 :
x <- y <- runif(1e7)
x[1e4] <- NA
y[1e7] <- NA
microbenchmark::microbenchmark(any(is.na(x)), anyNA(x), any(is.na(y)), anyNA(y), times=10)
# Unit: microseconds
# expr min lq mean median uq
# any(is.na(x)) 13444.674 13509.454 21191.9025 13639.3065 13917.592
# anyNA(x) 6.840 13.187 13.5283 14.1705 14.774
# any(is.na(y)) 165030.942 168258.159 178954.6499 169966.1440 197591.168
# anyNA(y) 7193.784 7285.107 7694.1785 7497.9265 7865.064
벡터의 마지막 값을 수정할 때조차 훨씬 더 빠릅니다. 이것은 부분적으로는 중간 논리 벡터의 회피 때문입니다.
나는 생각 중입니다:
any(is.na(data))
약간 더 빨라야합니다.
우리는 일부 Rcpp 프레젠테이션 에서 이것을 언급 하고 실제로 R 솔루션에 비해 Rcpp가 포함 된 임베디드 C ++에서 상당히 큰 이득 을 보여주는 벤치 마크가 있습니다.
벡터화 된 R 솔루션은 여전히 벡터 표현식의 모든 단일 요소 를 계산 합니다.
목표가 만족하는
any()
것이라면 첫 번째 일치 후에 중단 할 수 있습니다. 이것이 바로 Rcpp 설탕 (본질적으로 C ++ 표현식을 R 표현식처럼 보이게 만드는 C ++ 템플릿 마법, 자세한 내용은 이 비 네트 참조) 솔루션이 수행하는 것입니다. .
따라서 컴파일 된 특수 솔루션이 작동하면 실제로 빠른 솔루션을 얻을 수 있습니다. 이 질문에 제공된 솔루션과 비교하지는 않았지만 성능에 대해 상당히 확신합니다.
편집 그리고 Rcpp 패키지에는 디렉토리에 예제가 포함되어 있습니다 sugarPerformance
. 에 대한 'R-computes-full-vector-expression'에 비해 'sugar-can-abort-soon'이 수천 개 증가 any()
했지만이 경우에는 is.na()
단순한 부울 표현식이 포함되지 않는다는 점을 추가해야합니다 .
NA에서 멈추는 for 루프를 작성할 수 있지만, system.time은 NA가 어디에 있는지에 따라 달라집니다 ... (없으면 looooong가 걸립니다)
set.seed(1234)
x <- sample(c(1:5, NA), 100000000, replace = TRUE)
nacount <- function(x){
for(i in 1:length(x)){
if(is.na(x[i])) {
print(TRUE)
break}
}}
system.time(
nacount(x)
)
[1] TRUE
User System verstrichen
0.14 0.04 0.18
system.time(
any(is.na(x))
)
User System verstrichen
0.28 0.08 0.37
system.time(
sum(is.na(x)) > 0
)
User System verstrichen
0.45 0.07 0.53
다음은 지금까지 논의 된 다양한 방법 중 일부에 대한 내 (느린) 컴퓨터의 실제 시간입니다.
x <- runif(1e7)
x[1e4] <- NA
system.time(sum(is.na(x)) > 0)
> system.time(sum(is.na(x)) > 0)
user system elapsed
0.065 0.001 0.065
system.time(any(is.na(x)))
> system.time(any(is.na(x)))
user system elapsed
0.035 0.000 0.034
system.time(match(NA,x))
> system.time(match(NA,x))
user system elapsed
1.824 0.112 1.918
system.time(NA %in% x)
> system.time(NA %in% x)
user system elapsed
1.828 0.115 1.925
system.time(which(is.na(x) == TRUE))
> system.time(which(is.na(x) == TRUE))
user system elapsed
0.099 0.029 0.127
It's not surprising that match
and %in%
are similar, since %in%
is implemented using match
.
You can try:
d <- c(1,2,3,NA,5,3)
which(is.na(d) == TRUE, arr.ind=TRUE)
참고URL : https://stackoverflow.com/questions/6551825/fastest-way-to-detect-if-vector-has-at-least-1-na
'developer tip' 카테고리의 다른 글
Android Studio에서 모듈 이름을 바꾸시겠습니까? (0) | 2020.11.10 |
---|---|
컬렉션에서 목록으로 가장 빠르게 변환 (0) | 2020.11.10 |
CASE .. Oracle SQL의 WHEN 표현식 (0) | 2020.11.10 |
Google Developers Console에서 프로젝트를 삭제하는 방법 (0) | 2020.11.10 |
Angular2에서 원시 HTML을 바인딩하는 방법 (0) | 2020.11.10 |