【问题标题】:R: How to parse a string of dates in dataframe, split it, and return the date closest to today?R:如何解析数据框中的一串日期,将其拆分,并返回最接近今天的日期?
【发布时间】:2021-09-18 21:02:52
【问题描述】:

我真的为这个问题道歉,但我是 R 新手。我有一个包含 2 列的数据框。第一列包含名称,第二列包含文本格式的日期字符串 ("YYYYMMDD")。我正在尝试拆分第二列中的字符串,并为数据框中的每一行获取最接近今天的日期。以下是数据框的示例:

Column 1  Column2 
Name 1    20190607,20200901,20211203           
Name 2  20190607,20200901,20211203           

最终结果应类似于示例数据框,但右侧有一列显示最接近今天的日期。在此示例中为 20211203。提前感谢您的帮助

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用separate_rows, 处的'Column2' 拆分为新行,然后将'Column2' 转换为Date 类(ymd 来自lubridate)和slicetoday 的差异最小的行(按“Column1”分组后)

    library(dplyr)
    library(tidyr)
    library(lubridate)
    df2 <- df1 %>%
        separate_rows(Column2, sep=",\\s*") %>%
        mutate(Column2 = ymd(Column2)) %>%
        group_by(Column1) %>%
        slice(which.min(abs(Column2 - today()))) %>%
        ungroup
    

    -输出

    df2
    # A tibble: 2 x 2
      Column1 Column2   
      <chr>   <date>    
    1 Name 1  2021-12-03
    2 Name 2  2021-12-03
    

    数据

    df1 <- structure(list(Column1 = c("Name 1", "Name 2"), Column2 = c("20190607,20200901,20211203", 
    "20190607,20200901,20211203")), 
    class = "data.frame", row.names = c(NA, 
    -2L))
    

    【讨论】:

    • 感谢您的所有帮助。只是出于好奇,有没有办法让数据框保持最接近今天的日期?当我尝试在您的代码之后查看数据框时,它仍然显示带有长日期字符串的数据框
    • @matteo123 可能您正在检查原始数据df1。我展示的代码没有分配给一个对象。如果您想更新原始对象(我不推荐)使用df1 &lt;- df1 %&gt;% separate_rows(... 或将其分配给新对象df2 &lt;- df1 %&gt;% ...,然后检查df2
    【解决方案2】:
    DF = read.csv(text = "'Name 1';'20190607,20200901,20211203'
    'Name 2';'20190607,20200901,20211203'", sep=";", header=F, quote="'")
    
    DF
         V1                          V2
    1 Name 1 20190607,20200901,20211203 
    2 Name 2  20190607,20200901,20211203
    
    strsplit(DF[[2]], ',') |>
    lapply(\(x) as.Date(x,format="%Y%m%d")) |> 
    lapply(max) # `max` gets you the closest date to today since a date class is internally represented in integer using origin 1970 (i.e. 0).
    [[1]]
    [1] "2021-12-03"
    
    [[2]]
    [1] "2021-12-03"
    

    您可以将结果作为新列分配给 data.frame。

    【讨论】:

      【解决方案3】:

      用逗号分割字符串,取当前日期与所有其他日期的差值,返回每行差值最小的日期。

      这是一个基本的 R 选项 -

      df$Column3 <- as.Date(sapply(strsplit(df$Column2, ','), function(x) {
        x <- as.Date(x, '%Y%m%d')
        x[which.min(abs(x - Sys.Date()))]
      }), origin = '1970-01-01')
      df
      
      #  Column1                    Column2    Column3
      #1  Name 1 20190607,20200901,20211203 2021-12-03
      #2  Name 2 20190607,20200901,20211203 2021-12-03
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多