Добавление чего-либо в список дат в столбце - PullRequest
0 голосов
/ 14 декабря 2018

Предположим, что data.table:

dt <- structure(list(type = c("A", "B", "C"), dates = c("21-07-2011", 
    "22-11-2011,01-12-2011", "07-08-2012,14-08-2012,18-08-2012,11-10-2012"
    )), class = c("data.table", "data.frame"), row.names = c(NA, -3L))

Проверьте это:

   type                                       dates
1:    A                                  21-07-2011
2:    B                       22-11-2011,01-12-2011
3:    C 07-08-2012,14-08-2012,18-08-2012,11-10-2012

Мне нужно добавить, скажем, 5 к каждой из дат во втором столбце, т.е.Я хочу, чтобы результат был таким:

   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

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Используя только базовый R, вы можете сделать:

dt$dates = sapply(dt$dates, function(x){
  dates = as.Date(strsplit(x,",")[[1]], format = "%d-%m-%Y")
  paste(format(dates+5, '%d-%m-%Y'), collapse = ",")
})

Результат:

> 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

Эта процедура практически такая же, как процедура, предоставленная akrun, но без дополнительных библиотек.

0 голосов
/ 14 декабря 2018

Сгруппированные по типу, мы разбиваем «даты» по ,, (с 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 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...