将 NA 转换为任何类型,包括 POSIXct

Convert NA to any type, including POSIXct

我想在一个与 a 变量具有相同类型的变量中插入 NA。因此,对于可以具有任何 class 的变量 x,我想生成相同 class 的 NA。 as(NA, class(x)) 对除 POSIXct:

以外的所有东西都适用
> x = as.POSIXct("2021-01-01")
> as(NA, class(x))
Error in class1Def@contains[[class2]] : no such index at level 1

同样适用于:

> x_na = NA
> class(x_na) = class(x)
> identical(x_na, lubridate::NA_POSIXct_)
FALSE

更广泛的上下文:我正在尝试将用户提供的 data.frame 中的特定行除某些列之外的所有列都设置为 NA,这些列可以有任意数量的任意类型的列。所以 NA 应该是同一类型的.. 使用

  mutate(df, across(
    -c(except, these, columns), 
    ~ if_else(some_col == "some_value", as(NA, class(.)), .)
  ))

除了 POSIXct 列的上述错误外,效果很好。还有别的办法吗?

作为一个不令人满意的解决方法,POSIXct 变量的这种硬编码替代有效:

classed_na = function(x) {
  if (is.POSIXct(x)) {
    lubridate::NA_POSIXct_
  } else {
    as(NA, class(x))
  }
}

像这样使用

mutate(df, across(
    -c(except, these, columns), 
    ~ if_else(some_col == "some_value", classed_na(.), .)
  ))