【问题标题】:Function to convert character to date将字符转换为日期的函数
【发布时间】:2021-04-21 11:54:41
【问题描述】:

我想编写一个函数,该函数将接受具有类字符的列向量,将它们转换为日期,并输出数据帧。当我运行它时,它会输出一个数据帧列表,但没有进行转换。我可以重写以下内容来实现这一点吗?上下文是我可能有很多要转换的字符列,而拥有一个函数似乎是实现这一目标的最佳方法。

library(tidyverse)
date1<-c("2021-01-05","2021-01-06","2021-01-07","2021-01-08","2021-01-09")
date2<-c("2021-02-05","2021-02-06","2021-02-07","2021-02-08","2021-02-09")

df<-data.frame(date1,date2,stringsAsFactors = FALSE)

#the vector of columns to convert to date format
datecols<-c("date1","date2")

datefunc<-function(a){
  df2<-df%>%
    mutate(a=as.Date(a,"%Y-%m-%d" ))
  return(df2)}

df<-lapply(datecols,datefunc)

【问题讨论】:

    标签: r class date


    【解决方案1】:

    如果日期的格式为'Y-%m-%d',则无需指定格式。您可以编写一个简单的函数,将单个列更改为日期,然后使用lapply 将其应用于datecols

    datefunc<-function(a) as.Date(a)
    datecols<-c("date1","date2")
    
    df[datecols] <- lapply(df[datecols], datefunc)
    df
    
    #       date1      date2
    #1 2021-01-05 2021-02-05
    #2 2021-01-06 2021-02-06
    #3 2021-01-07 2021-02-07
    #4 2021-01-08 2021-02-08
    #5 2021-01-09 2021-02-09
    
    str(df)
    #'data.frame':  5 obs. of  2 variables:
    # $ date1: Date, format: "2021-01-05" "2021-01-06" "2021-01-07" ...
    # $ date2: Date, format: "2021-02-05" "2021-02-06" "2021-02-07" ...
    

    【讨论】:

      【解决方案2】:

      你也可以用这个。

      library(dplyr)
      library(lubridate)
      
      datefunc <- function(a){
        df2 <- df %>%
          mutate(across(all_of(a), ~ ymd(.x)))
        return(df2)
        }
      
      datefunc(datecols)
      
      # A tibble: 5 x 2
        date1      date2     
        <date>     <date>    
      1 2021-01-05 2021-02-05
      2 2021-01-06 2021-02-06
      3 2021-01-07 2021-02-07
      4 2021-01-08 2021-02-08
      5 2021-01-09 2021-02-09
      
      

      【讨论】:

        【解决方案3】:

        这有帮助吗?

         as.Date(df$date1, df$date2, format =  "%Y/%m/%d/")
        

        【讨论】:

          【解决方案4】:

          你可以试试

          > list2DF(Map(as.Date, df))
                 date1      date2
          1 2021-01-05 2021-02-05
          2 2021-01-06 2021-02-06
          3 2021-01-07 2021-02-07
          4 2021-01-08 2021-02-08
          5 2021-01-09 2021-02-09
          

          【讨论】:

            【解决方案5】:
            df %>% mutate(across(everything(), ~as.Date(., format = "%Y-%m-%d")))
            
                   date1      date2
            1 2021-01-05 2021-02-05
            2 2021-01-06 2021-02-06
            3 2021-01-07 2021-02-07
            4 2021-01-08 2021-02-08
            5 2021-01-09 2021-02-09
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-28
              • 2015-04-27
              相关资源
              最近更新 更多