【问题标题】:ifelse(length(date)==1, date, otherdate) differs between base R, dplyr and data.tableifelse(length(date)==1, date, otherdate) 在基础 R、dplyr 和 data.table 之间有所不同
【发布时间】: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


【解决方案1】:

老式的方法怎么样?

if(length(a)==1){a}else(as.POSIXct("2017-12-26 17:53:53 AEDT"))
[1] "2017-12-26 17:53:53 EST"

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2017-02-14
    相关资源
    最近更新 更多