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

R 与另一个向量具有相同数据类型的NA值的初始向量,r,na,R,Na,我正在编写一个框架,并尝试实现一个通用的init函数 给定特定数据类型的向量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_) #

我正在编写一个框架,并尝试实现一个通用的init函数

给定特定数据类型的向量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_ ...

v1我想你可以自己做函数。你必须把每件事都打出来,但只需要做一次

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"
na_maker我的第一个想法(被你的评论否定)是直截了当的:

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

@Josh O'Brien提出了一个可能的解决方案:

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

v2之后,我忘了提到,出于性能原因,我希望避免第二次覆盖错误初始化的向量。。。很抱歉修改了这个问题…我想
v2是的,这在简单的示例中会起作用,但我无法事先知道R的每个现有类,
class
可能会返回一个包含多个类名的字符向量。@RYoda您可以检查是否有任何类在列出的类中。可能不应该是向量同时具有
数值
字符
的情况。例如,聪明的方法,我只是试图通过仅取v1的第一个元素来优化它,以确定所需的NA类型…看起来我的问题是重复的;-)这仍然是关于第一次执行的最快执行(这是我的主要用例),所以我选择这个答案。
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
rep(c(v1[0], NA), length(v1))