【发布时间】:2020-04-06 03:59:16
【问题描述】:
我正在尝试测试日期向量的元素长度是否为 0。
使用 base R 可以正常工作,但将 POSIXct 作为数字返回:
a<-numeric(0)
>ifelse(length(a)==1,a,as.POSIXct("2017-12-26 17:53:53 AEDT"))
[1] 1514271233
保留类的解决方案是使用 dplyr 或 data.table,但它们都返回错误:
>dplyr::if_else(length(a)==1,a,as.POSIXct("2017-12-26 17:53:53 AEDT"))
Error: `true` must be length 1 (length of `condition`), not 0
Run `rlang::last_error()` to see where the error occurred.
>data.table::fifelse(length(a)==1,a,as.POSIXct("2017-12-26 17:53:53 AEDT"))
Error in data.table::fifelse(length(a) == 1, a, as.POSIXct("2017-12-26 17:53:53 AEDT")) :
'yes' has different class than 'no'. Please make sure that both arguments have the same class.
为什么不一样?我认为当逻辑测试返回FALSE 时,这些函数会忽略TRUE 选项。是否有不涉及转换回 POSIXct 的解决方案?
【问题讨论】:
-
"测试日期向量的元素长度是否为 0"...这没有意义。向量的元素长度为 1。如果要测试单个对象是否有长度,请使用
if() {} else{},而不是ifelse/if_else/fifelse/,它们旨在作用于向量并返回与输入长度相同的结果. -
您可以尝试
.POSIXct(a)或as.double(as.POSIXct(.))为data.table解决问题。我们对效率进行了权衡,以要求yes/no参数中的类型一致性
标签: r if-statement dplyr null data.table