如何创建一个新变量,排除缺失的日期值?

时间:2019-08-01 18:10:01

标签: r conditional-statements missing-data posixct

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

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

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

1 个答案:

答案 0 :(得分:0)

假设您有此数据(选择包含一些潜在的边缘情况)。顺便说一句,以可复制的形式包含数据或类似数据的样本是一种很好的形式。看到这里:How to make a great R reproducible example

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,但是它具有将日期转换为数字的麻烦方法,并且需要花费一些时间才能将它们恢复。参见How to prevent ifelse() from turning Date objects into numeric objects

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的{​​{1}}不这样做,因此您可以使用:

if_else

3)my_data$if_else = dplyr::if_else(is.na(my_data$date1), my_data$date2, my_data$date1) 是一种更简洁的方法:

dplyr::coalesce

输出

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