【发布时间】:2019-03-16 21:47:40
【问题描述】:
我需要创建一个具有给定模式和长度的向量。我使用这个有效的代码:
NA_vec<-function(vec_mode, vec_length)
{
vec<-vector(mode=vec_mode, length=vec_length)
vec<-replace(vec, vec==0, NA)
return(vec)
}
a<-NA_vec("numeric", 20)
问题:有没有更快的方法来做同样的事情?
编辑1:
另一个慢版本,但我认为适用于任何模式:
NA_vec5 = function(vec_mode, vec_length)
{
vec<-vector(mode=vec_mode, length=vec_length)
for (i in 1:length(vec))
{
vec[i]<-NA
}
return(vec)
}
基准测试:
n = 1e5
microbenchmark::microbenchmark(
DJJ=NA_vec4("numeric", n),
Gregor = NA_vec3("numeric", n),
G5W = NA_vec2("numeric", n),
OP = NA_vec("numeric", n),
OP_with_for = NA_vec5("numeric", n)
)
基准输出:
Unit: microseconds
expr min lq mean median uq max neval cld
DJJ 269.213 348.7520 489.1965 382.3055 424.9365 10240.310 100 a
Gregor 351.713 430.0685 578.2138 475.4635 542.7665 8784.119 100 a
G5W 1051.979 1207.5065 1588.2552 1271.6510 1364.6125 24294.583 100 b
OP 1537.902 1776.1270 2732.4603 1934.4170 2101.9840 26363.014 100 c
OP_with_for 5772.263 6065.1595 6473.3508 6196.4100 6376.8055 11310.446 100 d
【问题讨论】:
-
由于
vec==0,您的函数不适用于"character"模式。 -
在标题中你只提到了NA值,所以对于NA,添加一个'if语句',所以,如果模式是NA,那么做
rep(NA, vec_length),只会加速NA模式. -
我知道您要求(填写)NA,但我经常喜欢使用以下内容:例如v