【问题标题】:How to use data.table fifelse function correctly in R?如何在 R 中正确使用 data.table fifelse 函数?
【发布时间】:2021-12-14 14:14:51
【问题描述】:

我正在使用以下数据集

dt <- data.table(RequestTime = c("2011-01-01 07:00:42","2011-01-02 05:00:47","2011-01-03 07:05:02","2011-01-04 04:00:42","2011-01-05 02:00:11"), ExportTime = c("2011-01-01 07:00:50","2011-01-05 05:00:52","2011-01-01 07:06:33","2011-03-04 04:00:51","2011-01-06 02:00:22"))

由于我正在处理日期,因此使用以下方法将两列都转换为正确的格式:

dt$RequestTime <- as.POSIXct(dt$RequestTime)
dt$ExportTime <- as.POSIXct(dt$ExportTime)

我正在尝试使用 ifelse 条件语句来根据条件更新 ExportTime 的值,如果开始日期和 RequestTime 之间的差异小于 86400 秒(24 小时),那么我保持 ExportTime 相同,但如果差异大于 86400 秒,则适用第二个条件。这是我的做法。

x <- dt$RequestTime
y <- dt$ExportTime
start_date <- as.Date("2011-01-01")

dt$ExportTime <- fifelse((difftime(start_date, x, units = "secs") < 86400), y, 
    y - (difftime(start_date, x, units = "secs")))

因此,在这种情况下,5 个观察值中只有 1 个应该保持不变。但是当我运行它时,我看到所有的观察结果都保持不变。任何帮助将不胜感激)

【问题讨论】:

    标签: r if-statement conditional-statements


    【解决方案1】:

    原因是要切换参数,否则全部变为负数

    > difftime(start_date, x, units = "secs")
    Time differences in secs
    [1]  -46842 -126047 -219902 -295242 -374411
    > difftime(start_date, x, units = "secs") < 86400
    [1] TRUE TRUE TRUE TRUE TRUE
    > difftime(x, start_date, units = "secs") < 86400
    [1]  TRUE FALSE FALSE FALSE FALSE
    

    dt$ExportTime <- fifelse((difftime( x, start_date, units = "secs") < 86400), y, 
        y - (difftime(start_date, x, units = "secs")))
    

    -输出

    > dt
               RequestTime          ExportTime
    1: 2011-01-01 07:00:42 2011-01-01 07:00:50
    2: 2011-01-02 05:00:47 2011-01-06 16:01:39
    3: 2011-01-03 07:05:02 2011-01-03 20:11:35
    4: 2011-01-04 04:00:42 2011-03-07 14:01:33
    5: 2011-01-05 02:00:11 2011-01-10 10:00:33
    

    与原作对比

    > dt
      RequestTime          ExportTime
    1: 2011-01-01 07:00:42 2011-01-01 07:00:50
    2: 2011-01-02 05:00:47 2011-01-05 05:00:52
    3: 2011-01-03 07:05:02 2011-01-01 07:06:33
    4: 2011-01-04 04:00:42 2011-03-04 04:00:51
    5: 2011-01-05 02:00:11 2011-01-06 02:00:22
    

    【讨论】:

    • 非常感谢!这有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2021-01-13
    • 2016-04-24
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多