【问题标题】:how to fill the missing date info如何填写缺失的日期信息
【发布时间】:2020-06-23 19:34:31
【问题描述】:

我正在尝试构建一个缺少日期插补的函数。样本数据集是

StartDate <-c("UN Mar 2011","UN UNK 2013","UN UNK 2013","UN Jul 2014","UN UNK 2013","UN May 2018","UN UNK 2013","UN UNK 2013","UN May 2010","UN UNK 2014","UN UNK 2007","UN Dec 2017","UN Apr 2017","UN UNK 2008","UN Nov 2017")

EndDate <- c( "UN Mar 2011","NA","NA","NA","NA","NA","NA","NA","un May 2010","UN Jan 2017","un UNK 2007","NA","UN Jul 2017","NA","UN Nov 2017")

Sample.data <- data.frame(StartDate, EndDate)

我想定义函数来推算以下规则的日期:

• 缺少日期,然后将日期设置为该月的第一天;
• 缺少日期和月份,则日期将设置为 1 月 1 日;
• 缺少完整日期,然后将设置为缺少。

【问题讨论】:

  • 在您创建的数据中,引用了缺失值。
  • 在示例中,显示的是年和月。你能显示预期的输出吗
  • 您好,我已经用我想要得到的结果和到目前为止我写的代码更新了我的问题。谢谢

标签: r function date


【解决方案1】:

这应该符合您的要求。

它使用正则表达式"^.*?(\\d{4}).*?$",它将捕获任何四位数的年份并返回它。如果没有四位数的年份,它将返回整个字符串。因此,当我们尝试将其转换为数字时,我们将得到年份或 NA

然后我们用空格分割字符串并在第二个元素中搜索任何月份的缩写。如果那里没有,我们替换为 1。我们对第一个组件执行相同的操作,搜索数字 1:31。

最后,我们将年、月和日粘贴在一起并尝试转换为日期。如果我们没有一年,我们将收到NA。有年无月,月为1,无日也为1。

impute_dates <- function(x)
{
  years  <- gsub("^.*?(\\d{4}).*?$", "\\1", x)
  years  <- suppressWarnings(as.numeric(years))
  months <- match(sapply(strsplit(as.character(x), " "), `[`, 2), month.abb)
  months[is.na(months)] <- 1
  days <- match(sapply(strsplit(as.character(x), " "), `[`, 1), 1:31)
  days[is.na(days)] <- 1
  data.frame(years, months, days)
  as.Date(paste(years, months, days, sep = "-"))
}

所以你可以这样做:

impute_dates(Sample.data$StartDate)
#>  [1] "2011-03-01" "2013-01-01" "2013-01-01" "2014-07-01" "2013-01-01"
#>  [6] "2018-05-01" "2013-01-01" "2013-01-01" "2010-05-01" "2014-01-01"
#> [11] "2007-01-01" "2017-12-01" "2017-04-01" "2008-01-01" "2017-11-01"


impute_dates(Sample.data$EndDate)
#>  [1] "2011-03-01" NA           NA           NA           NA          
#>  [6] NA           NA           NA           "2010-05-01" "2017-01-01"
#> [11] "2007-01-01" NA           "2017-07-01" NA           "2017-11-01"

【讨论】:

  • 非常感谢。我试过了,它有效。我是 R 新手,理解正则表达式有些困难。可以多解释一下吗?谢谢。
  • 非常感谢。这是一个非常聪明的方法。 :)
  • 我们使用 sapply(strsplit(as.character(x), " ") 将变量分成 3 个部分。对于日期和月份,两者都使用了 ``` [, 2), ```。这是否意味着我们只检查变量的第二块。我有点困惑。我读错了吗?
  • 如果我们看起来像“un YYYY”会发生什么?然后第二部分将是年份信息。
  • @Stataq 你是对的 - 这是一个错误。我会改变它。很好看!
【解决方案2】:

这是一个非常简单的 tidyverse 方法。这可能不太可靠,并假设缺失的日期和月份实际上被编码为“UN”和“UNK”。

需要几个包,但相当可读。

library(lubridate)
library(stringr)

impute_dates <- function(x) {
  dmy(str_replace(str_replace(toupper(x), "UN", "1"), "UNK", "Jan"), quiet = TRUE)
}

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 2018-10-05
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多