【问题标题】:R: How do I add a column with day number based on a column with datesR:如何根据带有日期的列添加带有日期的列
【发布时间】:2021-12-16 21:02:39
【问题描述】:

我的问题是根据带有日期的另一列向带有日期的数据框中添加一列。每个 id 的最早日期应该用 0 编号,随后的所有日子都用与第 0 天的差异编号,按 id 分组。

我使用 tidyverse 函数进行了几次不成功的尝试,并看到有人编写复杂函数来创建此类数据的线程。但我希望我想要的输出非常简单?

输入:

id  date     
1   01-02-2010    
1   02-02-2010  
1   03-02-2010  
2   07-02-2010  
2   08-02-2010  
2   09-02-2010  

期望的输出:

id  date          day
1   01-02-2010    0
1   02-02-2010    1
1   03-02-2010    2
2   07-02-2010    0
2   08-02-2010    1
2   09-02-2010    2

【问题讨论】:

    标签: r dataframe date tidyverse


    【解决方案1】:
    library(dplyr)
    
    df %>% 
      mutate(date = lubridate::dmy(date)) %>% 
      group_by(id) %>% 
      mutate(day = date - first(date))
    
    #> # A tibble: 6 x 3
    #> # Groups:   id [2]
    #>      id date       day     
    #>   <int> <date>     <drtn>  
    #> 1     1 2010-02-01   0 days
    #> 2     1 2010-02-02   1 days
    #> 3     1 2010-02-03   2 days
    #> 4     2 2010-02-07   0 days
    #> 5     2 2010-08-08 182 days
    #> 6     2 2010-02-09   2 days
    

    有数据:

    df <- read.table(text = 
    'id  date     
    1   01-02-2010    
    1   02-02-2010  
    1   03-02-2010  
    2   07-02-2010  
    2   08-08-2010  
    2   09-02-2010 ', header = TRUE)
    

    【讨论】:

    • 我怀疑正确的格式是mdy?
    • 在我们读入的数据中,格式似乎是dmymdy(我假设dmy 是因为OP 的法语句柄,并且数据似乎使有点像这样)
    【解决方案2】:

    这是使用 lubridate 的解决方案(不在 tidyverse 中,但可以很好地使用):

    library(tidyverse)
    df <- read_table("id  date     
    1   01-02-2010    
    1   02-02-2010  
    1   03-02-2010  
    2   07-02-2010  
    2   08-02-2010  
    2   09-02-2010") %>% 
        select(-X3)
    #> Warning: Missing column names filled in: 'X3' [3]
    #> Warning: 1 parsing failure.
    #> row col  expected    actual         file
    #>   6  -- 3 columns 2 columns literal data
    
    library(lubridate)
    #> 
    #> Attaching package: 'lubridate'
    #> The following objects are masked from 'package:base':
    #> 
    #>     date, intersect, setdiff, union
    df %>%
        group_by(id) %>%
        mutate(
            date = dmy(date),
            day = as.numeric(date - min(date)))
    #> # A tibble: 6 × 3
    #> # Groups:   id [2]
    #>      id date         day
    #>   <dbl> <date>     <dbl>
    #> 1     1 2010-02-01     0
    #> 2     1 2010-02-02     1
    #> 3     1 2010-02-03     2
    #> 4     2 2010-02-07     0
    #> 5     2 2010-02-08     1
    #> 6     2 2010-02-09     2
    

    reprex package (v2.0.1) 于 2021-11-02 创建

    【讨论】:

    • 抱歉,08-08-2010 是原帖中的错字,现在正在编辑
    • @sindri_baldur 我注意到这是预期结果的错字并更改了它
    猜你喜欢
    • 2013-05-31
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多