gpt4 book ai didi

r - 尝试从 5 位或 6 位数字中提取日期

转载 作者:行者123 更新时间:2023-12-04 14:39:49 25 4
gpt4 key购买 nike

我正在尝试从数字中提取日期。日期存储为 11 位个人 ID 号码(日期-月-年)的前 6 位。不幸的是,它的基于云的数据库 (REDCap) 输出被格式化为一个数字,因此在该月的前 9 天出生的人的前导零最终是一个 10 位的 ID 号,而不是一个 11 位的 ID 号。我设法提取了与日期相对应的 6 位或 5 位数字,即 311230 代表 1930 年 12 月 31 日,或 11230 代表 1930 年 12 月第一个。我最终遇到了两个我无法解决的问题。
假设我们使用以下数字:

dato <- c(311230, 311245, 311267, 311268, 310169, 201104, 51230, 51269, 51204)
我将这些转换为字符串,然后应用 as.Date() 函数:
datostr <- as.character(dato)
datofinal <- as.Date(datostr, "%d%m%y")
datofinal
我遇到的问题是:
  • 五位数字(例如 11230)被报告为 NA。
  • 六位数字被识别,但在 1.1.1969 之前出生的数字会被报告为加上 100 年,即 010160 被转换为 2060.01.01

  • 我相信这对于那些更了解 R 的人来说一定很容易,但是,我很难解决这个问题。任何帮助是极大的赞赏。
    你好
    比约恩

    最佳答案

    如果你的 5 位数字真的只需要补零,那么

    dato_s <- sprintf("%06d", dato)
    dato_s
    # [1] "311230" "311245" "311267" "311268" "310169" "201104" "051230" "051269" "051204"
    从那里开始,您关于“1969 年之前的日期”的问题,请查看 ?strptime'%y'图案:
     '%y' Year without century (00-99).  On input, values 00 to 68 are
    prefixed by 20 and 69 to 99 by 19 - that is the behaviour
    specified by the 2018 POSIX standard, but it does also say
    'it is expected that in a future version the default century
    inferred from a 2-digit year will change'.
    因此,如果您有特定的替代年份,则需要在发送至 as.Date 之前添加世纪。 (使用 strptime -patterns)。
    dato_d <- as.Date(gsub("([0-4][0-9])$", "20\\1",
    gsub("([5-9][0-9])$", "19\\1", dato_s)),
    format = "%d%m%Y")
    dato_d
    # [1] "2030-12-31" "2045-12-31" "1967-12-31" "1968-12-31" "1969-01-31" "2004-11-20"
    # [7] "2030-12-05" "1969-12-05" "2004-12-05"
    在这种情况下,我假设 50-99 将是 1900,其他一切都是 2000。如果您需要 40 或 30,请随意调整模式:将数字添加到第二个模式(例如, [3-9] )并从第一个模式(例如, [0-2] ),确保所有十年都包含在一个模式中,而不是“两者都不是”,也不是“两者”。
    借用 Allan's answer , 我喜欢 now() 的假设(因为您确实提到了“出生于”)。无 lubridate , 尝试这个:
    dato_s <- sprintf("%06d", dato)
    dato_d <- as.Date(dato_s, format = "%d%m%y")
    dato_d[ dato_d > Sys.Date() ] <-
    as.Date(sub("([0-9]{2})$", "19\\1", dato_s[ dato_d > Sys.Date() ]), format = "%d%m%Y")
    dato_d
    # [1] "1930-12-31" "1945-12-31" "1967-12-31" "1968-12-31" "1969-01-31" "2004-11-20"
    # [7] "1930-12-05" "1969-12-05" "2004-12-05"

    关于r - 尝试从 5 位或 6 位数字中提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62640499/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com