首页 > 解决方案 > 将 NA 转换为任何类型,包括 POSIXct

问题描述

我想在与 a 变量具有相同类型的变量中插入 NA。因此,对于可以具有任何类的变量x,我想生成同一类的 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 应该是同一类型.. 使用

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

除了上述POSIXct列错误外,效果很好。还有其他方法吗?

标签: rclassna

解决方案


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

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(.), .)
  ))

推荐阅读