Конвертировать символьный столбец на сегодняшний день в нескольких форматах - PullRequest
0 голосов
/ 30 апреля 2018

Вот мой начальный пример данных из Excel (в следующий раз я собираюсь рассказать моему клиенту об аккуратных данных):

date_string  
3/13, 3/17, 3/20  
4/13  
5/12, 5/20  

Я довольно близко к тому, что хочу с этим:

 library(tidyverse)  
 library(stringr)  
    data <- str_split_fixed(data$date_string, ",", 3)%>%  
    as_tibble() %>%  
    gather() %>%
    filter(value != "")  

тогда я остаюсь с этим:

key    value
v1    3/13  
v1    43203  
v1    5/12  
v2    3/17
v2    5/20
v3    3/20

Это достаточно хорошо, что я могу выполнить остальное форматирование и аранжировку в Excel, но чем больше я могу сделать в R, тем лучше, тем более, что мне придется делать все это снова в следующий раз, когда я обновлю конечный продукт , Я чувствую, что есть функция lubridate, чтобы помочь мне с этим, но mdy и date продолжают возвращать ошибки.

Значение, которое я хочу, это приведенная выше таблица, но в формате m / d / y.

Обновление

Основываясь на ответе ниже, я добавил следующее. Это работает, но, вероятно, есть более элегантный способ сделать это:

   data <- str_split_fixed(data$date_string, ",", 3)%>%  
    as_tibble() %>%  
    gather() %>%
    filter(value != "") %>%  
    mutate(value =  
     if_else(
      str_detect(value, "/") == T,
      paste0(value, "/2018"),
      as.character(as_date(as.numeric(value), origin = "1900-01-01")))) %>%        
    mutate(value =
     if_else(
      str_detect(value, "/") == T,
      mdy(value),
      ymd(value)))

Я получаю эти предупреждения, но мне нужны именно эти данные:

1. In as_date(as.numeric(value), origin = "1900-01-01") :  
 NAs introduced by coercion
2. 1 failed to parse.
3. 5 failed to parse.

Не уверен, как он "не смог выполнить синтаксический анализ", когда последний столбец "value" возвращается в качестве переменной даты. , ,

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вот немного другой подход:

library(tidyverse)
library(stringr)
library(lubridate)

data <- c(
"3/13, 3/17, 3/20",
"4/13",
"5/12, 5/20")

df <- tibble(date_string = data) %>% 
  mutate(date_string = str_split(date_string, ", ")) %>% 
  unnest() %>% 
  mutate(date_string = ymd(str_c("2018-", date_string)))
df
0 голосов
/ 30 апреля 2018

Вот что вы можете сделать:

Сначала добавьте год к вашим датам:

dates <- ("3/13", "4/17", "5/12", "3/17", "5/20", "3/20")
dates <- paste0(dates, "/18")

Во-вторых, преобразуйте их, указав формат (в вашем случае m / d / y):

  as.Date(dates,  "%m/%d/%y")
  [1] "2018-03-13" "2018-04-17" "2018-05-12" "2018-03-17" "2018-05-20" "2018-03-20"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...