Это то, что вы ищете?
Иллюстративные данные:
dataset <- data.frame(Customer_Name = c("A", "B"),
Country = c("X", "Y"),
Transaction = c("01-01-2009", "31-01-2012"),
Delivery = c("01-02-2009", "01-02-2012"),
Return = c("27-02-2009", "22-03-2012"),
Cost = c(1234, 5678))
dataset
Customer_Name Country Transaction Delivery Return Cost
1 A X 01-01-2009 01-02-2009 27-02-2009 1234
2 B Y 31-01-2012 01-02-2012 22-03-2012 5678
Чтобы изменить формат даты для всех столбцов даты в одном go, сначала определите все столбцы, содержащие значения даты с grepl
и регулярное выражение, а затем используйте format
и as.Date
внутри lapply
:
dataset[apply(dataset, 2, function(x) all(grepl("\\d{2}-\\d{2}-\\d{4}", x)))] <-
lapply(dataset[apply(dataset, 2, function(x) all(grepl("\\d{2}-\\d{2}-\\d{4}", x)))],
function(x) format(as.Date(x, format = "%d-%m-%Y"), "%d-%b-%Y"))
Результат:
dataset
Customer_Name Country Transaction Delivery Return Cost
1 A X 01-Jan-2009 01-Feb-2009 27-Feb-2009 1234
2 B Y 31-Jan-2012 01-Feb-2012 22-Mär-2012 5678
РЕДАКТИРОВАТЬ :
Если даты имеют разные форматы, это решение поможет:
Данные:
dataset <- data.frame(Customer_Name = c("A", "B", "C"),
Country = c("X", "Y", "Z"),
Transaction = c("01-Mar-2015", "31-01-2012", "15/01/1999"),
Delivery = c("01-02-2018", "01/08/2016", "17-09-2007"),
Return = c("27/11/2009", "22-Jan-2013", "20-Nov-1987"),
Cost = c(1234, 5678, 6655))
Чтобы избежать переполнения приведенного ниже оператора apply
, давайте определим два сокращения векторы, один для шаблонов, по которым будут обнаруживаться столбцы с датами, и один для различных форматов даты:
date_patterns <- "\\d{2}(-|/)\\d{2}(-|/)\\d{4}|\\d{2}-\\w+-\\d{2}"
date_formats <- c("%d-%m-%Y", "%d/%m/%Y", "%d-%b-%Y")
Преобразование различных дат в один стандартизированный формат даты, а именно %d-%b-%Y
, в столбцы дат основаны на функциях из пакета lubridate
:
library(lubridate)
dataset[apply(dataset, 2, function(x) all(grepl(date_patterns, x)))] <-
apply(dataset[apply(dataset, 2, function(x) all(grepl(date_patterns, x)))], 2,
function(x) format(parse_date_time(x, orders = date_formats), "%d-%b-%Y"))
Это результат:
dataset
Customer_Name Country Transaction Delivery Return Cost
1 A X 01-Mär-2015 01-Feb-2018 27-Nov-2009 1234
2 B Y 31-Jan-2012 01-Aug-2016 22-Jan-2013 5678
3 C Z 15-Jan-1999 17-Sep-2007 20-Nov-1987 6655
РЕДАКТИРОВАТЬ 2 :
Вот еще одно решение, использующее пакет anytime
:
library(anytime)
dataset[apply(dataset, 2, function(x) all(grepl(date_patterns, x)))] <-
apply(dataset[apply(dataset, 2, function(x) all(grepl(date_patterns, x)))], 2,
function(x) format(anydate(x), "%d-%b-%Y"))