首页 > 解决方案 > 如何创建不包括缺失日期值的新变量?

问题描述

我正在尝试编写一个 R 代码来创建一个新变量,该变量从 POSIXct/POSIXt 类的两个变量中排除缺失的日期值。因此,例如,如果“date1”和“date2”是我的两个变量,主要包括日期和一些缺失值。我想将所有非缺失日期值存储在一个新变量“var”中。我相信我的代码看起来像这样:

if date1 = 'NA' then
var = date2 
else var = date1
end

我很清楚在这种情况下不能使用 if-else 语句。但是,我不确定如何编写此代码。任何帮助表示赞赏!:)

标签: rconditional-statementsmissing-dataposixct

解决方案


假设您有这些数据(选择包含一些潜在的边缘情况)。顺便说一句,以可复制的形式包含数据样本或类似数据的样本是一种很好的形式。请参阅此处:如何制作出色的 R 可重现示例

my_data <- data.frame(
  date1 = as.Date(c("2020-01-01", "2020-01-01", "2020-01-01", NA, NA), "%Y-%m-%d"),
  date2 = as.Date(c("2020-01-02", "2020-01-02", NA, "2020-01-02", NA), "%Y-%m-%d")
)

> my_data
       date1      date2
1 2020-01-01 2020-01-02
2 2020-01-01 2020-01-02
3 2020-01-01       <NA>
4       <NA> 2020-01-02
5       <NA>       <NA>

这里有一些方法来做你问的。

1) 在 Base R 中,您可以使用ifelse,但是将日期转换为数字的方法很麻烦,并且需要一些工作才能将它们恢复。请参阅如何防止 ifelse() 将 Date 对象转换为数字对象

my_data$base = as.Date(ifelse(is.na(my_data$date1), 
                              as.character(my_data$date2),
                              as.character(my_data$date1)), "%Y-%m-%d")

2) dplyr'sif_else不这样做,所以你可以使用:

my_data$if_else = dplyr::if_else(is.na(my_data$date1), 
                              my_data$date2,
                              my_data$date1)

3)dplyr::coalesce是一种更简洁的好方法:

my_data$coalesce = dplyr::coalesce(my_data$date1, my_data$date2)

输出

> my_data
       date1      date2     ifelse    if_else   coalesce
1 2020-01-01 2020-01-02 2020-01-01 2020-01-01 2020-01-01
2 2020-01-01 2020-01-02 2020-01-01 2020-01-01 2020-01-01
3 2020-01-01       <NA> 2020-01-01 2020-01-01 2020-01-01
4       <NA> 2020-01-02 2020-01-02 2020-01-02 2020-01-02
5       <NA>       <NA>       <NA>       <NA>       <NA>

推荐阅读