Функция для идентификации всех столбцов имеет данные DATE и меняет их формат в R? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть фрейм данных, который содержит более одного столбца с типом DATE. Я хочу идентифицировать все столбцы с данными DATE и изменить их формат на dd-mmm-yyyy.

dataset <- data.frame(Customer_Name, Country, Transaction, Delivery, Return, Cost)

Предположим, данные транзакции, доставки и возврата имеют дату.

Изменить формат данных даты всех столбцов даты в дд-ммм-гггг

Ожидаемый результат:

Столбцы даты: транзакция, доставка, возврат

И набор данных теперь имеет все данные даты в формате дд-ммм-гггг.

Я хочу создать для этого функцию fun <- function(dataset) {}

1 Ответ

0 голосов
/ 24 апреля 2020

Это то, что вы ищете?

Иллюстративные данные:

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...