【问题标题】:In R Convert to Date of several columns?在 R 中转换为几列的日期?
【发布时间】:2020-10-01 16:10:44
【问题描述】:

你能帮我看看下面的代码吗? 我确实试图找到一个答案,但可能错过了,如果有一个已经对不起你的时间。

我有一个如下例所示的 DataFrame。我需要做的是将所有 dt_ 变量转换为日期。 我一个一个地用 mutate()/lapply 得到它,但我正在寻找一种自动方法。我在 R 工作。

co_cid Tipo  dt_notificacao co_uf_notificac~ co_uf_completo no_municipio_no~ dt_diagnostico_~
  <fct>  <fct> <fct>          <fct>            <fct>          <fct>            <fct>           
1 A90    Deng~ 01/10/2016     PE               PERNAMBUCO     Recife           23/01/2015      
2 A90    Deng~ 02/11/2016     PE               PERNAMBUCO     Recife           09/01/2015      
3 A90    Deng~ 01/11/2016     PE               PERNAMBUCO     Recife           12/12/2015      
4 A90    Deng~ 02/04/2016     PE               PERNAMBUCO     Recife           12/08/2015      
5 A90    Deng~ 01/08/2016     PE               PERNAMBUCO     Recife           12/01/2015      
6 A90    Deng~ 01/11/2016     PE               PERNAMBUCO     Recife           12/04/2015  

我得到了所有的 dt_,应该是日期:

dt_vec <- nomes_colunas[(sapply(nomes_colunas, startsWith,prefix = "dt_"))]

然后我想用它将所有 dt_ 列转换为 Date 并将其替换为原始 df。 我尝试了一个带有 mutate 的 for 循环,但列名与变量名保持一致。所以我最终只有一个带有日期的“coluna”变量。

for (coluna in dt_vec) {
  df_dados <- df_dados %>% mutate(coluna, coluna = as.Date(coluna, format = "%d/%m/%Y"))
}

至于 apply 我发现很难替换原始 df 中的值。

提前致谢!

【问题讨论】:

    标签: r date dplyr data-cleaning


    【解决方案1】:

    如果我们要转换多列,请使用mutateacross

    library(lubridate)
    library(dplyr)#1.0.0  
    df_dados <- df_dados %>%
                    mutate(across(starts_with('dt_', dmy)))
    

    dplyr的早期版本中,可以使用mutate_at

    df_dados <- df_dados %>%
                  mutate_at(vars(starts_with('dt_')), dmy)
    

    【讨论】:

    • 太快了!我认为第一个版本缺少一个“)”,但是知道cross函数真的很好!谢谢! df_dados &lt;- df_dados %&gt;% + mutate(across(starts_with('dt_'), dmy))
    • @YuriMizusawa 抱歉,我没有测试它。感谢您的纠正
    【解决方案2】:

    您可以使用startsWith 找出要转换的列,并使用lapply 将它们转换为使用as.Date 的日期。我们可以使用基础 R 来做到这一点。

    cols <- startsWith(names(df), 'dt')
    df[cols] <- lapply(df[cols], as.Date, "%d/%m/%Y")
    df
    
    #  co_cid  Tipo dt_notificacao co_uf_notificac co_uf_completo no_municipio_no dt_diagnostico_
    #1    A90 Deng~     2016-10-01              PE     PERNAMBUCO          Recife      2015-01-23
    #2    A90 Deng~     2016-11-02              PE     PERNAMBUCO          Recife      2015-01-09
    #3    A90 Deng~     2016-11-01              PE     PERNAMBUCO          Recife      2015-12-12
    #4    A90 Deng~     2016-04-02              PE     PERNAMBUCO          Recife      2015-08-12
    #5    A90 Deng~     2016-08-01              PE     PERNAMBUCO          Recife      2015-01-12
    #6    A90 Deng~     2016-11-01              PE     PERNAMBUCO          Recife      2015-04-12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 2020-12-14
      • 2021-01-03
      • 2011-01-29
      • 2021-12-18
      • 2021-03-07
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多