我正在寻找一个增量序列:
我有一个数据帧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
我将不胜感激。
谢谢
答案 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