ошибка в функции для преобразования целого числа в формат даты в r, ошибка: «не знаю, как преобразовать». в класс «Свидание» - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в R и не могу найти решение для поиска в Google, поэтому здесь у нас go:

У меня есть фрейм данных со многими столбцами. У двух из них есть даты в этом. Один столбец как character, а другой как integer64. Значения в обоих столбцах выглядят так: «201802171254». поэтому они в формате Y%m%d%H%M. Я хочу преобразовать их в форматы даты, используя функцию. До этого я пробовал следующие две строки:

df$column_character <- as.Date(as.character(c(df$column_character)), format = '%Y%m%d%H%M')

df$column_integer64 <- as.Date(as.character(c(df$column_integer64)), format = '%Y%m%d%H%M')

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

date_format <- function(df, col){
  col_q = enquo(col)

df %>%

base::as.Date(as.character(c(!!col_q), na.rm = TRUE), format = '%Y%m%d%H%M')

}

date_format(df$column_character)

date_format(df$column_integer64)

Это работает, но только для первого столбца character. Для столбца integer64 я получаю сообщение об ошибке:

Error in as.Date.default(., as.character(c(!!col_q), na.rm = TRUE), format = "%Y%m%d%H%M") : 
  do not know how to convert '.' to class “Date” 

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

где моя ошибка? почему он работает без функции, но я пытаюсь использовать его как шаблон, половина которого больше не работает?

спасибо за ваши ответы заранее

1 Ответ

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

Не могу точно сказать, почему функция сработала в первую очередь. Тем не менее, ваша функция, на мой взгляд, не очень хорошо проработана. Если вы хотите использовать tidy eval, взгляните на мою функцию date_format_new. Однако, на мой взгляд, есть более простой способ настроить функцию, которую я кодировал как date_format_simple.

library(dplyr)

df <- data.frame(
  column_character = "201802171254",
  column_integer64 = 201802171254,
  stringsAsFactors = FALSE
)

date_format <- function(df, col){
  col_q = enquo(col)

  df %>%
    base::as.Date(as.character(c(!!col_q), na.rm = TRUE), format = '%Y%m%d%H%M')
}

date_format(df$column_character)
#> [1] "2018-02-17"
date_format(df$column_integer64)
#> Error: Quosures can only be unquoted within a quasiquotation context.
#> 
#>   # Bad:
#>   list(!!myquosure)
#> 
#>   # Good:
#>   dplyr::mutate(data, !!myquosure)

# Works
date_format_new <- function(df, col){
  col_q = enquo(col)

  df %>%
    pull(!!col_q) %>% 
    as.character() %>% 
    base::as.Date(format = '%Y%m%d%H%M')

}

date_format_new(df, column_character)
#> [1] "2018-02-17"
date_format_new(df, column_integer64)
#> [1] "2018-02-17"

# Simpler
date_format_simple <- function(col){
  base::as.Date(as.character(col), format = '%Y%m%d%H%M')
}

date_format_simple(df$column_character)
#> [1] "2018-02-17"
date_format_simple(df$column_integer64)
#> [1] "2018-02-17"

Создано в 2020-04-09 пакетом Представлять (v0.3.0)

...