Как преобразовать символьную строку в as.Дата, но отображать как дд / мм / гггг

#r #dataframe #date #dplyr #as.date

#r #фрейм данных #Дата #dplyr #as.date

Вопрос:

Мои извинения, я, похоже, не могу найти решение этого, казалось бы, основного вопроса.

Это

 p %>% mutate(date = as.Date(mr_daterd,  format = '%d/%m/%Y'), mr_daterd = mr_daterd)
  

Дает

      mr_daterd       date
1  28/03/2013  2013-03-28
2   10/01/2009 2009-01-10
3   16/09/2005 2005-09-16
4  28/03/2013  2013-03-28
5  28/03/2013  2013-03-28
6  28/03/2013  2013-03-28
  

Мне нужно p$date быть dd/mm/yyyy .

 p <- structure(list(mr_daterd = c("18/03/2011", "10/01/2009", "10/01/2009", 
"11/03/2004", "10/01/2009", "18/03/2011", "16/09/2005", "10/01/2009", 
"18/03/2011", "10/01/2009", "18/03/2011", "18/03/2011", "28/03/2013 ", 
"28/03/2013 ", "10/01/2009")), row.names = c(NA, -15L), class = "data.frame")
  

Комментарии:

1. Попробуйте это: p %>% mutate(date = as.Date(mr_daterd, format = '%d/%m/%Y'), mr_daterd = mr_daterd,date2=format(date,'%d/%m/%Y'))

2. Также смотрите date2 , какой стиль вы хотите. Даты в R хранятся как year-month-day , если вы хотите их изменить, вы должны использовать format() .

3. Спасибо @Duck. Кажется, что в вашем решении мне нужно выполнить два шага: сначала создать date=as.Date.. , а затем создать date2=format.. из date — разве нет решения, которое выполняет то, что я запрашиваю, в одной строке? Я пытался date=format(as.Date(mr_daterd, format = '%d/%m/%Y'),'%d/%m/%Y') , но это не помогло.

4. Может быть, попробуйте это p %>% mutate(date=format(as.Date(mr_daterd, format = '%d/%m/%Y'),'%d-%m-%Y'))

5. cmirian, ваши даты уже указаны в формате «dd / mm / yyyy». Если вы хотите, чтобы они были фактическими объектами даты в R, они сохраняются и отображаются в yyyy-mm-dd формате. При использовании format вы преобразуете их обратно в символы. Если вам нужно отобразить даты определенным образом для определенного вывода, вы делаете это как «последнее» после обработки ваших дат.

Ответ №1:

Один из способов добиться того, чего вы хотите, — создать свой собственный класс S3. Это не так сложно, как кажется, требуется всего две строки кода:

 as.myDate <- function(x, ...) `class<-`(as.Date(x, ...), c("myDate", "Date"))
format.myDate <- function(x, ...) format(`class<-`(x, "Date"), "%d/%m/%Y")
  

Затем это позволяет вам сделать:

 p$date <- as.myDate(p$mr_daterd, format = "%d/%m/%Y")

p
#>      mr_daterd       date
#> 1   18/03/2011 18/03/2011
#> 2   10/01/2009 10/01/2009
#> 3   10/01/2009 10/01/2009
#> 4   11/03/2004 11/03/2004
#> 5   10/01/2009 10/01/2009
#> 6   18/03/2011 18/03/2011
#> 7   16/09/2005 16/09/2005
#> 8   10/01/2009 10/01/2009
#> 9   18/03/2011 18/03/2011
#> 10  10/01/2009 10/01/2009
#> 11  18/03/2011 18/03/2011
#> 12  18/03/2011 18/03/2011
#> 13 28/03/2013  28/03/2013
#> 14 28/03/2013  28/03/2013
#> 15  10/01/2009 10/01/2009
  

Этот новый класс наследует все другие общие функции от «Date», поэтому он по-прежнему будет вести себя так же, как объект Date:

 difftime(p$date[2], p$date[1])
#> Time difference of -797 days

plot(p$date, rnorm(15))
  

введите описание изображения здесь