【问题标题】:Assigning a new variable based on date根据日期分配新变量
【发布时间】:2018-06-22 14:30:42
【问题描述】:

我正在尝试创建一个新的时间变量,用于分配自每个 ID 的第一个日期以来已经过去了多少个月

例如

ID      Date      
aa1    4/1/2015    
aa1    10/1/2015    
aa1    4/1/2016    
aa1    7/1/2015   
aa1    1/1/2016    
aa1    1/1/2015    
aa2n   4/1/2017    
aa2n   10/1/2017    
aa2n   10/1/2016   
aa2n   1/1/2017   
aa2n   7/1/2017    

我想输出为

 ID      Date      Time
aa1    1/1/2015     0
aa1    4/1/2015     3
aa1    7/1/2015     6 
aa1    10/1/2015    9
aa1    1/1/2016     12
aa1    4/1/2016     15
aa2n   10/1/2016    0
aa2n   1/1/2017     3
aa2n   4/1/2017     6 
aa2n   7/1/2017     9
aa2n   10/1/2017    12

日期变量按季度计算,因此最早的季度为 0,随后的每个季度为 +3

谢谢!

【问题讨论】:

    标签: r loops


    【解决方案1】:

    这是一个lubridate + tidyverse 解决方案

    library(lubridate);
    library(tidyverse);
    df %>%
        mutate(Date = mdy(Date)) %>%
        group_by(ID) %>%
        mutate(Time = month(Date) - month(min(Date)) + 12 * (year(Date) - year(min(Date)))) %>%
        arrange(ID, Time)
    ## A tibble: 11 x 3
    ## Groups:   ID [2]
    #   ID    Date        Time
    #   <fct> <date>     <dbl>
    # 1 aa1   2015-01-01    0.
    # 2 aa1   2015-04-01    3.
    # 3 aa1   2015-07-01    6.
    # 4 aa1   2015-10-01    9.
    # 5 aa1   2016-01-01   12.
    # 6 aa1   2016-04-01   15.
    # 7 aa2n  2016-10-01    0.
    # 8 aa2n  2017-01-01    3.
    # 9 aa2n  2017-04-01    6.
    #10 aa2n  2017-07-01    9.
    #11 aa2n  2017-10-01   12.
    

    样本数据

    df <- read.table(text =
        "ID      Date
    aa1    4/1/2015
    aa1    10/1/2015
    aa1    4/1/2016
    aa1    7/1/2015
    aa1    1/1/2016
    aa1    1/1/2015
    aa2n   4/1/2017
    aa2n   10/1/2017
    aa2n   10/1/2016
    aa2n   1/1/2017
    aa2n   7/1/2017    ", header = T)
    

    【讨论】:

    • 谢谢你的工作,如果可能的话你能解释一下第二个变异行吗?
    • @Al.So 第二行mutate 计算月差为diff(month, first_month_in_group) + 12 * diff(year, first_year_in_group),其中最后一项确保我们正确计算超过一年的情况下经过的月数已经过去了。
    【解决方案2】:

    您可以这样做: 您可能需要将日期从您拥有的格式转换为下面“日期”列的格式。

    library(zoo)
    df <- data.frame(ID = c("aa1", "aa1", "aa1", "aa1"),
                 Date = as.Date(c("4/1/2015", "10/1/2015", "4/1/2016", "7/1/2015")),
                 date = as.Date(c("2015-04-01", "2015-10-01", "2016-04-01", "2015-07-01")))
    
    df$time <- format(as.yearqtr(df$date, format = "%m/%d/%Y"), format = "%q")
    

    【讨论】:

    • 这会将第一季度设置为 1,第二季度设置为 2,依此类推,然后第二年第一季度又回到 1,不是吗?
    • 啊,是的,那么你可以这样做:library(zoo) df &lt;- data.frame(ID = c("aa1", "aa1", "aa1", "aa1"), Date = as.Date(c("4/1/2015", "10/1/2015", "4/1/2016", "7/1/2015")), date = as.Date(c("2015-04-01", "2015-10-01", "2016-04-01", "2015-07-01"))) %&gt;% mutate(time = as.numeric(format(as.yearqtr(df$date, format = "%m/%d/%Y"), format = "%q"))) %&gt;% mutate(time = time - 1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2021-07-24
    • 2021-08-08
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多