具有与另一个向量相同数据类型的 NA 值的初始向量

Init vector with NA value of same data type as another vector

我正在编写一个框架并尝试实现一个通用的初始化函数。

给定一个特定数据类型的向量 v1:

如何使用与第一个向量 v1 中相同数据类型的 NA 值显式初始化另一个向量 v2?

示例:

v1 <- c("a", "b")
v2 <- rep(NA, length(v1))  # would use the wrong type since NA is NA_logical_ by default
typeof(v2) # "logcial"

v2 <- rep(NA_character_)   # what I really want
typeof(v2) # "character"

v1 <- 1:2
v2 <- rep(NA_real_, length(v1))
typeof(v2) "double"

# ... same for NA_complex_, NA_integer_ ...

我真的必须写一个函数然后做 "if typeof(v1) then NA..." 或者是否有现有的功能或更聪明的方法?

我想你可以制作自己的函数。您必须输入所有内容,但只需输入一次。

na_maker <- function(class){
  switch(class,
         double = NA_real_,
         integer = NA_integer_,
         character = NA_character_,
         logical = NA,
         complex = NA_complex_)
}


v1 <- c("a", "b")
v2 <- rep(na_maker(class(v1)), length(v1))

class(v2)
[1] "character"

您还可以制作另一个包装函数来简化事情:

rep_na <- function(vec){
  rep(na_maker(class(vec)), length(vec))
}

v2 <- rep_na(v1)

我的第一个想法(被你的评论否定了)很简单:

v2 <- rep(NA, length(v1))
class(v2) <- class(v1)

一行是:

v2 <- v1[v1==NA]

但这似乎更慢,例如:

library(microbenchmark)                                                 
v1 <- sample(1:10000)                                                   

microbenchmark(                                                         
one = { v2 <- v1[v1==NA] },                                             
two = { v2 <- rep(NA, length(v1)); class(v1) <- class(v2)}, times = 1000
)                                                                       
#> Unit: microseconds
#>  expr    min     lq     mean  median      uq     max neval
#>   one 69.804 71.078 92.79524 71.6385 72.4335 650.255  1000
#>   two 18.983 19.424 22.96938 20.9525 21.5040 953.085  1000

The answers to this question might help you

@Josh O'Brien 建议的可能解决方案:

rep(c(v1[0], NA), length(v1))