【问题标题】:Average days between 2 dates columns R2个日期列R之间的平均天数
【发布时间】:2021-09-22 14:26:33
【问题描述】:

我在数据框中有 2 个日期列,观察次数超过 10 万次

date1 startdate
2020-07-30 23:00:00 NA
2020-12-10 04:00:00 2021-06-30 20:00:00
2020-10-26 21:00:00 NA
2019-12-03 03:01:00 2020-02-01 01:00:00
NA 2020-06-28 07:30:00

我必须填写 startdate 列中的缺失值,所以我的想法是计算 date1 和 startdate 之间的平均天数,并在此平均值和 date1 日期之间相加后替换 startdate 中的 NA。

期望的输出

例如,如果平均天数是 70,那么:

date1 startdate
2020-07-30 23:00:00 2020-10-08 23:00:00
2020-12-10 04:00:00 2021-06-30 20:00:00
2020-10-26 21:00:00 2021-01-04 21:00:00
2019-12-03 03:01:00 2020-02-01 01:00:00
NA 2020-06-28 07:30:00

可重现的例子:

结构(列表(日期1 =结构(c(1594069500, 1575320400, 1603742400, NA, 1574975100, 1570845660, 1575061500, 1564714​​860, 1576544400, 1574802300, 1576198800, 1575338460, 1575666180, 不适用, 1594327800, 1595365200, 1594069800, 1591905600, 1594414800, NA), class= c("POSIXct", "POSIXt"), tzone = ""), startdate = structure(c(1599242400, 1577127600, NA, 1603396800, 1577516400, 1573714800, 1577689200, 1566374400, 1577343600, 1577516400, 1577343600, NA, 1577257200, NA, 1605193200, 1605106800, 1600358400, 1600358400, 1600272000, NA), class= c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(1L, 2L、7591L、8301L、8692L、8​​694L、8699L、8703L、8706L、8709L、8710L、 8714L、8715L、8730L、8732L、8733L、8736L、8740L、8745L、8749L ), class= "data.frame")

【问题讨论】:

    标签: r date datetime statistics


    【解决方案1】:

    您可以使用difftime 计算startdatedate1 之间的平均持续时间。通过将平均值添加到 date1 来替换 startdate 中的 NA 值。

    avg <- as.numeric(mean(difftime(df$startdate, df$date1, units = 'secs'), na.rm = TRUE))
    df$startdate[is.na(df$startdate)] <- df$date1[is.na(df$startdate)] + avg
    df
    

    【讨论】:

    • 我的完整数据的 avg 值为 NaN。既然我们使用了 na.rm=T ,你知道它是从哪里来的吗?
    • 您可以检查几件事。 1)在您的真实数据集中,列名称为startdatedate1,或者它们是否命名为其他名称? 2) 一列总是NA 吗?
    • 我在执行之前以正确的方式重命名了代码中的列,并且我的列中没有一个总是 NA
    • 不,事实上你是对的,在这个示例中,两列从来没有同时填充过。
    【解决方案2】:

    这样的?? 我无法验证,因为您想要的输出与您的示例数据不匹配..

    library(data.table)
    setDT(mydata)
    mydata[is.na(startdate) & !is.na(date1), 
           startdate := date1 + round(mean(abs(DT$date1 - DT$startdate), na.rm = TRUE))]
    

    【讨论】:

      猜你喜欢
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多