我正在编写一个框架并尝试实现一个通用的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_ ...
我真的必须编写一个函数并执行"if typeof(v1) 则 NA..." 还是有现有的功能或更聪明的方法?
这个问题的答案可能会对你有所帮助
@Josh O'Brien建议的可能解决方案:
rep(c(v1[0], NA), length(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"
您还可以创建另一个包装器函数来简化操作:
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