如果在同一列中有NA,空单元格和不同格式,如何使用as.Date?

时间:2018-02-12 08:13:55

标签: r na as.date

在我的数据框中,列包含两种日期格式(%Y-%m-%d%d/%m/%Y),空单元格和NA。以下方法是我的尝试,没有产生预期的结果。我试着把它们转换成如下......

a <- as.Date(data$x, "%Y-%m-%d")
b <- as.Date(data$x, "%d/%m/%Y")

然后将它们组合在一起......

a[is.na(a)] <- b[!is.na(b)] 

但是,我收到一条错误,说明不同的行数。由于空单元和NA的存在,我相信它。有没有办法可以根据行号/观察/排名将+ b放在一起?

提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

我认为你需要的是ifelse

x = c("2012-01-01", "13/01/2012", "")
x1 = as.Date(x, format="%Y-%m-%d")
x2 = as.Date(x, format="%d/%m/%Y")
y = as.Date(
  ifelse(!is.na(x1), as.Date(x1), 
         ifelse(!is.na(x2), x2, x1)), 
  origin = as.Date("1970/01/01")
)
y
[1] "2012-01-01" "2012-01-13" NA   

出于某种原因,我必须将ifelse包装到as.Date()中,否则日期将打印为数字,而不是实际日期。在这种情况下需要origin参数。

修改

以上是上述代码的工作原理。 ifelse(condition, value_if_true, value_if_false)是一个向量化函数,它需要三个与参数长度相同的向量。 (R的工作方式,如果其中一个参数是单个值,它将自动重复适当的次数,这个术语是“广播”。)ifelse()的执行如下:

a)对于condition中的每个元素,请检查它是TRUE还是FALSE

b)如果conditionTRUE,请从value_if_true向量中取相应的值。

c)否则,如果conditionFALSE,请从value_if_false向量

中取相应的值

现在,您可以将ifelse()嵌套到彼此中,这样可以进行三向条件检查,如果需要还可以进行更多检查。请注意,嵌套多个ifelse调用可能会非常快速地陷入混乱状态。

有了这些知识,上面的代码应该很容易解析:

1)x创建一个日期的示例向量,存储为具有不同格式的字符串。

2)x1正确解析第一个日期,无法解析第二个日期。

3)x2正确解析第二个日期格式,但无法解析第一个日期。

4)然后两个嵌套的ifelse调用将正确解析的日期合并到一个向量中。首先ifelse检查是否正确解析了第一个日期格式(!is.na(x)表示“x的值不是NA”),并从{{返回非缺失值1}}。如果缺少x1,则会调用第二个x1,它会从ifelse返回非缺失值,然后,如果x2也缺失,则会将缺失值返回到最终结果。

5)由于某种原因,嵌套的x2调用返回格式为数字而不是字符串的日期,因此我将4)的结果包装到ifelse中以获得格式良好的日期。在R中,当您尝试将数字转换为日期时,您必须提供as.Date - 日期被解释为自某个预定义的起源日期以来经过的天数,其中R是1970年1月1日。

希望这有帮助。