从R3.1.0开始,anyNA()
就是实现这一点的方法.在原子向量上,这将在第一个NA之后停止,而不是像any(is.na())
那样穿过整个向量.此外,这避免了创建一个包含is.na
的中间逻辑向量,该向量会立即被丢弃.borrow 乔兰的例子:
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
请注意,即使我们修改向量的最后一个值,它的速度也会大大加快;这部分是因为避免了中间逻辑向量.