Я хочу объединить две переменные в одну с форматом даты - PullRequest
0 голосов
/ 25 января 2019

У меня есть набор данных с символьным столбцом для месяцев (MONTH) и числовым столбцом с указанием лет (YEAR). Чтобы работать с ним как с данными панели, мне нужно объединить эти YEAR и MONTH в переменную с форматом даты.

Я попытался изменить переменную MONTH на числовой формат, а затем объединить MONTH со столбцом YEAR. R не распознает его как переменную даты.

В настоящее время это выглядит так:

  STATE          MONTH     YEAR     VALUE
California        JAN      2018      800
California        FEB      2018      780
California        MAR      2018      600
    ...           ...       ...      ...
Minesota          JAN      2018      800
Minesota          FEB      2018      780
Minesota          MAR      2018      600
    ...           ...       ...      ...

Я хочу вот так:

  STATE          TIME        VALUE
California     01-2018        800
California     02-2018        780
California     03-2018        600
    ...           ...         ...
Minesota       01-2018        800
Minesota       02-2018        780
Minesota       03-2018        600
    ...           ...         ...

Ответы [ 5 ]

0 голосов
/ 25 января 2019

Если вы хотите использовать полнофункциональное решение Tidyverse, рассмотрите эту комбинацию tidyr и lubridate 'parse_date_time:

library(tidyverse)
df <- tibble::tribble(
  ~STATE,      ~MONTH,      ~YEAR,   ~VALUE,
"California",     "JAN",      2018,      800,
"California",     "FEB",      2018,      780,
"California",     "MAR",      2018,      600,
"Minesota",       "JAN",      2018,      800,
"Minesota",       "FEB",      2018,      780,
"Minesota",       "MAR",      2018,      600)

df %>%
   tidyr::unite(TIME, c(MONTH, YEAR), sep = "-") %>%
   dplyr::mutate(TIME = lubridate::parse_date_time(TIME, "my"))
#> # A tibble: 6 x 3
#>   STATE      TIME                VALUE
#>   <chr>      <dttm>              <dbl>
#> 1 California 2018-01-01 00:00:00   800
#> 2 California 2018-02-01 00:00:00   780
#> 3 California 2018-03-01 00:00:00   600
#> 4 Minesota   2018-01-01 00:00:00   800
#> 5 Minesota   2018-02-01 00:00:00   780
#> 6 Minesota   2018-03-01 00:00:00   600

Также проверьте следующий связанный вопрос: Преобразование года и месяца (в формате «гггг-мм») в дату?

0 голосов
/ 25 января 2019

Вы могли бы упростить нижеприведенное, но это облегчит вам видеть, что происходит:

library(lubridate)
library(tidyverse)

df2 <- df %>% 
  mutate(TIME = parse_date_time(paste0(MONTH, YEAR), orders = "%b%Y"),
         TIME = as.character(substr(TIME, 6, 7)),
         TIME = paste0(TIME, "-", YEAR))

Используется lubridate - самый простой способ разбора дат в R IMO, dplyr из tidyverse и substr из базы R.

Если вы хотите сохранить столбец даты, просто введите другой 101 * * и назовите новый столбец как-то иначе.

0 голосов
/ 25 января 2019

Я бы порекомендовал справиться с этим, пройдя через добросовестные даты R, используя as.Date для генерации даты R, а затем format для рендеринга желаемой строки.Примерно так:

df$TIME <- format(as.Date(paste0(df$MONTH, df$YEAR, "01"), format="%b%Y%d"), "%m-%Y")

Я произвольно назначаю первую дату каждой дате в вашем наборе данных, но это не имеет значения, потому что вызов format включает только месяц и год.

0 голосов
/ 25 января 2019

Сочетая ответ Тима с простым в использовании пакетом дат lubridate мы получаем:

# This can handle months of JAN, FEB, ETC. Or it can handle months of 01,02,etc.
df$TIME <- lubridate::ymd(paste0(df$YEAR,df$MONTH,"01")) 

# or if you need it in MM-YYYY format:
df$TIME <- format(lubridate::ymd(paste0(df$YEAR,df$MONTH,"01")), "%m-%Y")
0 голосов
/ 25 января 2019

В базе R вы можете сделать что-то вроде:

transform(df,TIME = paste(sprintf('%02d',match(MONTH,toupper(month.abb))),YEAR,sep = '-'))[c(1,5,4)]
       STATE    TIME VALUE
1 California 01-2018   800
2 California 02-2018   780
3 California 03-2018   600
4        ...  NA-...   ...
5   Minesota 01-2018   800
6   Minesota 02-2018   780
7   Minesota 03-2018   600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...