首页 > 解决方案 > 根据日期分配新变量

问题描述

我正在尝试创建一个新的时间变量,该变量分配自每个 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

谢谢!

标签: rloops

解决方案


这是一个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)

推荐阅读