在r中更改日期增量

时间:2019-03-06 01:56:28

标签: r sequence mutate

我正在寻找一个增量序列:

我有一个数据帧public patientDetails$: Observable<any>; constructor(...) { this.patientDetails$ = http.get("/home/patient-details").pipe(shareReplay(1)); }

dt <- data.table(Customer = c("a", "b", "c"), count = c(3, 4, 5), Date = c("2019-02-01","2019-05-01","2019-10-01"))

我正在使用 Customer count Date 1: a 3 2019-02-01 2: b 4 2019-05-01 3: c 5 2019-10-01

按计数复制此数据帧

我收到的输出是

dt[rep(seq(1, nrow(dt)), dt$count)]

是否可以将3个月添加到增量日期中,以便获得以下输出?

    Customer count       Date
 1:        a     3 2019-02-01
 2:        a     3 2019-02-01
 3:        a     3 2019-02-01
 4:        b     4 2019-05-01
 5:        b     4 2019-05-01
 6:        b     4 2019-05-01
 7:        b     4 2019-05-01
 8:        c     5 2019-10-01
 9:        c     5 2019-10-01
10:        c     5 2019-10-01
11:        c     5 2019-10-01
12:        c     5 2019-10-01

我将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:1)

我们可以使用months中的lubridate并创建一个seq数量,以便从每个Customer的第一个值开始,每行增加3个月。

new_dt <- dt[rep(seq(1, nrow(dt)), dt$count)]

library(dplyr)
library(lubridate)

new_dt %>%
  group_by(Customer) %>%
  mutate(Date = as.Date(Date[1]) + months(seq(0, length.out = n(), by = 3)))

#   Customer  count      Date      
#   <chr>    <dbl>     <date>    
# 1 a            3 2019-02-01
# 2 a            3 2019-05-01
# 3 a            3 2019-08-01
# 4 b            4 2019-05-01
# 5 b            4 2019-08-01
# 6 b            4 2019-11-01
# 7 b            4 2020-02-01
# 8 c            5 2019-10-01
# 9 c            5 2020-01-01
#10 c            5 2020-04-01
#11 c            5 2020-07-01
#12 c            5 2020-10-01

可以使用ave

来应用相同的逻辑
with(new_dt, ave(as.Date(Date), Customer, FUN = function(x) 
      x[1] + months(seq(0, length.out = length(x), by = 3))))

#[1] "2019-02-01" "2019-05-01" "2019-08-01" "2019-05-01" "2019-08-01" "2019-11-01"
#[7] "2020-02-01" "2019-10-01" "2020-01-01" "2020-04-01" "2020-07-01" "2020-10-01"

答案 1 :(得分:0)

R为基础的lubridate

library(lubridate)

new_dt$Date=as.Date(new_dt$Date)+month(ave(new_dt$count,new_dt$Customer,FUN=function(x) cumsum(x)-x[1]))
new_dt
    Customer count       Date
 1:        a     3 2019-02-01
 2:        a     3 2019-02-04
 3:        a     3 2019-02-07
 4:        b     4 2019-05-01
 5:        b     4 2019-05-05
 6:        b     4 2019-05-09
 7:        b     4 2019-05-13
 8:        c     5 2019-10-01
 9:        c     5 2019-10-06
10:        c     5 2019-10-11
11:        c     5 2019-10-16
12:        c     5 2019-10-21

答案 2 :(得分:0)

data.table解决方案

dt[, .(count, Date = as.Date(Date) + seq(0, count - 1) * months(3)), by = Customer]
#    Customer count       Date
# 1:        a     3 2019-02-01
# 2:        a     3 2019-05-01
# 3:        a     3 2019-08-01
# 4:        b     4 2019-05-01
# 5:        b     4 2019-08-01
# 6:        b     4 2019-11-01
# 7:        b     4 2020-02-01
# 8:        c     5 2019-10-01
# 9:        c     5 2020-01-01
#10:        c     5 2020-04-01
#11:        c     5 2020-07-01
#12:        c     5 2020-10-01