Изменение YYYY-MM-DD на три разных столбца - PullRequest
0 голосов
/ 07 июня 2018

Я изо всех сил пытаюсь найти информацию об изменении даты записи в три столбца.

Текущие данные:

      Date
2018-06-07
2017-03-01
2015-11-30

Желаемый результат

Year  Month  Day
2018     06   07
2017     03   01
2015     11   30

Ответы [ 3 ]

0 голосов
/ 07 июня 2018
 Dates <- c("2018-06-07", "2017-03-01", "2015-11-30")
> scan(text=Dates, what=list(Year="",Month="",Day=""), sep="-")
Read 3 records
$Year
[1] "2018" "2017" "2015"

$Month
[1] "06" "03" "11"

$Day
[1] "07" "01" "30"

Так что это в формате «dataframe»:

data.frame( scan(text=Dates, what=list(Year="",Month="",Day=""),
                 sep="-", quiet=TRUE) )
#-------
  Year Month Day
1 2018    06  07
2 2017    03  01
3 2015    11  30

Если бы эти значения уже были классифицированы как Date- (или factor-) в dataframe или списке, то вам понадобится as.character для принудительного применения столбца Date.

0 голосов
/ 07 июня 2018

Кажется, что пользователь просто хранит даты в виде строк, которые нужно разделить на символ разделителя.В этом случае использование tidyr::separate является самым простым решением:

library(tidyverse)
Dates <- data.frame(id = c('a', 'b', 'c'),
                    date = c("2018-06-07", "2017-03-01", "2015-11-30"))
Dates %>%
    separate(date, c("Year","Month","Day"))

  id Year Month Day
1  a 2018    06  07
2  b 2017    03  01
3  c 2015    11  30

Более безопасным решением, вероятно, является сохранение дат в виде объекта даты.В этом случае вы хотели бы использовать решения, опубликованные @ G.Grothendieck.

0 голосов
/ 07 июня 2018

1) chron Поскольку ввод не был указан воспроизводимо, мы предполагаем, что:

Dates <- c("2018-06-07", "2017-03-01", "2015-11-30")

, в этом случае это будет работать - вы можете опустить часть [...], если столбецпорядок не имеет значения:

library(chron)
do.call("cbind", month.day.year(Dates)[c("year", "month", "day")])

с указанием этой матрицы (используйте data.frame вместо cbind, если вы хотите кадр данных):

     year month day
[1,] 2018     6   7
[2,] 2017     3   1
[3,] 2015    11  30

Приведенный выше код также будетработать, если Даты имеют класс "Date".

2) формат (базовый)

DatestoNum <- function(fmt) as.numeric(format(as.Date(Dates), fmt))
sapply(c(year = "%Y", month = "%m", day = "%d"), DatestoNum)

, дающий тот же результат.Это также будет работать, если Dates класса "Date".В этом случае вы можете удалить as.Date.Используйте as.data.frame для результата, если вы предпочитаете результат с фреймом данных.

2a) Поочередно запишите его:

cbind(year = DatestoNum("%Y"), month = DatestoNum("%m"), day = DatestoNum("%d"))

3) lubridate

library(lubridate)

cbind(year = year(Dates), month = month(Dates), day = day(Dates))

4) read.table (base)

read.table(text = format(Dates), sep = "-", col.names = c("year", "month", "day"))

Если Dates уже является символом, вы можете опционально опустить format.

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