r - 如何创建不包括缺失日期值的新变量?
问题描述
我正在尝试编写一个 R 代码来创建一个新变量,该变量从 POSIXct/POSIXt 类的两个变量中排除缺失的日期值。因此,例如,如果“date1”和“date2”是我的两个变量,主要包括日期和一些缺失值。我想将所有非缺失日期值存储在一个新变量“var”中。我相信我的代码看起来像这样:
if date1 = 'NA' then
var = date2
else var = date1
end
我很清楚在这种情况下不能使用 if-else 语句。但是,我不确定如何编写此代码。任何帮助表示赞赏!:)
解决方案
假设您有这些数据(选择包含一些潜在的边缘情况)。顺便说一句,以可复制的形式包含数据样本或类似数据的样本是一种很好的形式。请参阅此处:如何制作出色的 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>