Опция
A data.table
с использованием lubridate
library(data.table)
library(lubridate)
setDT(df)[, .(
borrowing_date = seq(as.Date(borrowing_date), as.Date(borrowing_date) %m+% years(10), by = "quarter"),
principal,
maturity_date = seq(as.Date(maturity_date), as.Date(maturity_date) %m+% years(10), by = "quarter"),
maturity_time.years.),
by = loan.id]
# loan.id borrowing_date principal maturity_date maturity_time.years.
# 1: 1 2013-03-03 1000000 2015-03-03 2
# 2: 1 2013-06-03 1000000 2015-06-03 2
# 3: 1 2013-09-03 1000000 2015-09-03 2
# 4: 1 2013-12-03 1000000 2015-12-03 2
# 5: 1 2014-03-03 1000000 2016-03-03 2
#---
#119: 3 2026-10-03 3000000 2029-10-02 3
#120: 3 2027-01-03 3000000 2030-01-02 3
#121: 3 2027-04-03 3000000 2030-04-02 3
#122: 3 2027-07-03 3000000 2030-07-02 3
#123: 3 2027-10-03 3000000 2030-10-02 3
Объяснение: Мы используем seq.Date
для генерации последовательности дат by = "quarter"
, где конечной датой является исходная дата плюс 10лет (или в lubridate
синтаксис %m+% years(10)
).
Обратите внимание, что имена столбцов изменились (обычно в R плохо иметь имена столбцов со специальными символами, такими как пробелы, запятые и т. д.).
Пример данных
df <- read.table(text =
"'loan id' borrowing_date principal maturity_date maturity_time(years)
01 2013-03-03 1000000 2015-03-03 02
02 2015-07-30 2000000 2017-07-29 02
03 2017-10-03 3000000 2020-10-02 03", header = T)