【问题标题】:Convert a a character column to date with multiple formats将字符列转换为具有多种格式的日期
【发布时间】:2018-10-10 18:00:10
【问题描述】:

这是我从 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 函数可以帮助我解决这个问题,但 mdydate 不断返回错误。

我想要的值是上面的表格,但是是 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.

当最终的“值”列作为日期变量返回时,不确定它是如何“解析失败”的。 . .

【问题讨论】:

  • 您应该分享您的预期输出。此外,当您遇到错误时,它们会附带错误消息以帮助您解决问题。你应该分享你得到的错误。
  • 我认为你需要做一些条件测试来调用正确的函数并在右行使用正确的参数。您还需要做更多的数据调整 "3/13" 不是 mdy 格式,因为没有年份。使用paste 粘贴您想要的任何年份,例如ifelse(grepl("/" value), paste0(value, "/2001"), value) 粘贴/2001 任何values,其中已经有/

标签: r dplyr tidyr lubridate stringr


【解决方案1】:

你可以这样做:

首先,将年份添加到您的日期:

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"

【讨论】:

    【解决方案2】:

    这里有一个稍微不同的方法:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2015-10-02
      相关资源
      最近更新 更多