Для каждого DATE
мы можем разделить столбец DATE
на «;», преобразовать их в дату, извлечь год, используя format
, взять уникальные годы и вставить их вместе, используя toString
.
DT$Period <- sapply(DT$DATE, function(x)
toString(sort(unique(format(as.Date(strsplit(x, ";")[[1]]), "%Y")))))
DT
# NAME DATE Period
#1: JOE 2015-01-02;2015-01-07;2021-05-02;2019-02-05 2015, 2019, 2021
#2: MARY 2017-08-02;2000-01-22;2003-03-07;2017-10-09 2000, 2003, 2017
#3: PAUL 2013-08-02;2022-06-02;2012-03-15 2012, 2013, 2022
Мы можем уменьшить шаг as.Date
и format
, используя функцию year из пакета lubridate
, которая дает тот же результат.
library(lubridate)
DT$Period <- sapply(DT$DATE, function(x)
toString(sort(unique(year(strsplit(x, ";")[[1]])))))
Iя не эксперт по data.table
, но я думаю, что вы упускаете из своей попытки параметр группирования (by
), потому что в настоящее время он дает вам уникальный год из всего столбца DATE
, вам нужно указать, что вынужно unique
год для каждой строки отдельно, что упоминается в аргументе by
.
DT[,period:= paste(sapply(strsplit(DATE,";"),
function(x) sort(unique(substr(x,1,4)),)),collapse = ","), by = 1:nrow(DT)]
DT
# NAME DATE period
#1: JOE 2015-01-02;2015-01-07;2021-05-02;2019-02-05 2015,2019,2021
#2: MARY 2017-08-02;2000-01-22;2003-03-07;2017-10-09 2000,2003,2017
#3: PAUL 2013-08-02;2022-06-02;2012-03-15 2012,2013,2022