在我的数据框中,列包含两种日期格式(%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放在一起?
提前感谢您的回答。
答案 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)如果condition
为TRUE
,请从value_if_true
向量中取相应的值。
c)否则,如果condition
为FALSE
,请从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日。
希望这有帮助。