如何在日期中使用is.na函数

时间:2019-10-23 16:32:21

标签: r

我使用以下命令将存储为“ dd-Mmm-yyyy”(即2016年4月18日”)的变量转换为格式为“ mm-dd-yyyy”的日期:

data$variable = as.Date(data$variable, "%d-%b-%Y")

效果很好。另外,运行此命令后,以前为空的缺失值现在在我的数据集中显示为NA。但是,然后我尝试使用is.na将这些NA值设为0:

data[is.na(data)] <- 0

但是出现以下错误:

Error in as.Date.numeric(value) : 'origin' must be supplied

我一直无法弄清楚该如何解决。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

日期“ 0”可能不明确:

  • POSIX时间(又称大纪元时间,Unix时间,参考号:https://en.wikipedia.org/wiki/Unix_time)定义了“ 0”时间/日期为“ 1970年1月1日世界标准时间00:00:00” ;
  • Excel日期0被定义为1/0/1900(看起来很奇怪);同样,时间0为1/0/1900 12:00:00 AM
  • 其他社会/宗教组织可能更喜欢其他参考文献(例如,伊斯兰教可能是“公元7世纪的开始” ,wiki ref;基督教可能更喜欢公元0年;无偏见,请不要打架)

在R中,一旦定义了类POSIXtDate,然后用as.numeric将其转换回数字,将遵循POSIX / epoch约定,这意味着

as.numeric(as.Date("1969-01-01"))
# [1] -365

但是它永远不会假设日期/时间输入模棱两可,因此您必须使用origin=来指定它。 (请注意,我并没有必须在上一个命令中提供原点,因为"1969-01-01"既非数字,又具有as.Date可以轻松解释的明确日期格式; as.Date("1969")不起作用,可能是因为它可能是1969年内的任何日期。)

为明确起见,建议您使用

as.Date(0, origin="1970-01-01")

as.POSIXct(0, origin="1970-01-01") # assumes 00:00:00 UTC
as.POSIXct(0, origin="1970-01-01 00:00:00")

答案 1 :(得分:0)

您可以尝试以下方法将NA转换为0。

library(tidyr)
library(tidyverse)
library(dplyr)

mutate_all(x, ~replace(., is.na(.), 0)
mutate_all(x, ~replace_na(., 0))
library(dplyr)

# This converts at column level.
df <- df %>%
    mutate(Col1 = if_else(is.na(Col1), 0, Col1))


x <- replace(x,is.na(x),0)

希望上述方法之一可以工作。