Сгруппированные по типу, мы разбиваем «даты» по ,
, (с strsplit
), конвертируем в объект класса Date
с dmy
(из lubridate
), добавляем 5
, format
это в исходный формат данных, paste
это в одну строку и назначить (:=
) для обновления столбца «даты» в наборе данных
library(lubridate)
library(data.table)
dt[, dates := paste(format(dmy(unlist(strsplit(dates, ","))) + 5,
'%d-%m-%Y'), collapse=','), by = type]
dt
# type dates
#1: A 26-07-2011
#2: B 27-11-2011,06-12-2011
#3: C 12-08-2012,19-08-2012,23-08-2012,16-10-2012
Другим вариантом без разделения, преобразования в Date
, переформатирования является метод регулярного выражения с gsubfn
library(gsubfn)
dt[, dates := gsubfn("^(\\d+)", ~ as.numeric(x) + 5,
gsubfn(",(\\d+)", ~sprintf(",%02d", as.numeric(x) + 5), dates))]
dt
# type dates
#1: A 26-07-2011
#2: B 27-11-2011,06-12-2011
#3: C 12-08-2012,19-08-2012,23-08-2012,16-10-2012
ПРИМЕЧАНИЕ. Предполагается, что второй метод будет быстрее, поскольку мы не split
говорим, преобразуем, paste
и т. Д.