【问题标题】:Replacement of missing day and month in dates using R使用 R 替换日期中缺失的日期和月份
【发布时间】:2020-02-08 13:18:04
【问题描述】:

这个问题是关于如何使用 R 替换数据框中缺失的日期和月份。考虑到下面的数据框,99 表示缺失的日期或月份,NA 表示完全未知的日期。

df<-data.frame("id"=c(1,2,3,4,5),
           "date" = c("99/10/2014","99/99/2011","23/02/2016","NA",
                      "99/04/2009"))

我正在尝试根据以下标准替换缺失的日期和月份:

  1. 对于缺少日期但已知月份和年份的日期,替换日期将是从间隔中间(该月的第一天到最后一天)的随机选择。例如,对于 id 1,替换日期将从 2014 年 1 月 10 日中间到 2014 年 10 月 31 日采样。对于 id 5,这将是 01/04/2009 到 30/04/2009 的中间时间。值得注意的是不同月份的天数不同,例如10 月 31 天,4 月 30 天。

  2. 与 id 2 的情况一样,缺少日期和月份,替换日期是从间隔中间(一年中的第一天到最后一天)的随机选择,例如 01/01 /2011 至 31/12/2011。

请注意:完整的日期(例如 id 3 的情况)和 NA 不会被替换。

我已经尝试使用 seq 函数以及 as.POSIXct 和 as.Date 函数来获取要从中采样替换日期的日期序列。我遇到的困难是如何自动化 R 代码以获取日期间隔(它因不同的 id 而异)以及如何从间隔中间进行随机抽取。

预期输出将替换 id 1、2 和 5 的日期,但 id 3 和 4 的日期保持不变。非常感谢您对此提供任何帮助。

【问题讨论】:

    标签: r date dataframe


    【解决方案1】:

    这不是最漂亮的,但它似乎可以工作并适应不同的月份和年份:

    set.seed(999)
    df$dateorig <- df$date
    
    seld <- grepl("^99/", df$date)
    selm <- grepl("^../99", df$date)
    md <- seld & (!selm)
    mm <- seld & selm
    df$date <- as.Date(gsub("99","01",as.character(df$date)), format="%d/%m/%Y")
    
    monrng <- sapply(df$date[md], function(x) seq(x, length.out=2, by="month")[2]) - as.numeric(df$date[md])
    df$date[md] <- df$date[md] + sapply(monrng, sample, 1)
    
    yrrng <- sapply(df$date[mm], function(x) seq(x, length.out=2, by="12 months")[2]) - as.numeric(df$date[mm])
    df$date[mm] <- df$date[mm] + sapply(yrrng, sample, 1)
    
    #df
    #  id       date   dateorig
    #1  1 2014-10-14 99/10/2014
    #2  2 2011-02-05 99/99/2011
    #3  3 2016-02-23 23/02/2016
    #4  4       <NA>         NA
    #5  5 2009-04-19 99/04/2009
    

    【讨论】:

    • 谢谢!您能否解释一下 monrng
    • @TRichard - 我正在遍历每个需要更改的值,并获取下个月开始的日期。然后我减去原始日期以计算该月有多少天。一旦我有了这个值,我就可以在这个范围内随机采样一个值并将其添加到原始日期。
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 2020-11-22
    • 2020-10-24
    • 1970-01-01
    • 2018-12-24
    • 2015-06-29
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多