【问题标题】:Turn all character dates columns in a dataframe to dates columns r将数据框中的所有字符日期列转换为日期列 r
【发布时间】:2021-05-12 19:18:37
【问题描述】:

我有一个包含 50 多个日期列的数据集。使用 fread 或 csv 函数将数据集导入 R 时,所有日期列都被格式化为字符列。虽然我可以花半天时间一次转换每一列,但我认为某些 R 专家可能已经找到了一种更好的方法来一次转换大量列的格式。

有没有一种有效的方法可以一举将列列表转换为正确日期格式的列?

我的虚拟数据如下:

【问题讨论】:

  • 仅供参考,以防您对输入的 csv 文件有任何控制权,如果日期格式为 YYYY-MM-DD,它们将被自动检测并读取为带有 fread 的日期(可能还有其他也有函数,但我只熟悉 fread)
  • 是的,出于同样的原因,我在 SQL(已验证并已格式化)中将日期列格式化为 YYYY-MM-DD,并在 r 中使用 fread 期望正确处理日期列。但我仍然面临同样的问题。

标签: r


【解决方案1】:

更新 我要感谢 @Gregor Thomas 先生提供宝贵的提示以添加到我的解决方案中。我们假设您的所有日期列都有一个 date 后缀,以便我们可以告诉 across 函数仅对它们应用日期转换。

library(dplyr)

df %>%
  mutate(across(ends_with("date"), ~ as.Date(.x, format = "%m/%d/%Y")))

# A tibble: 2 x 4
     id generic_name index_date ami_pre_date
  <dbl> <chr>        <date>     <date>      
1     1 ato          2016-10-27 2015-10-20  
2     2 sim          2017-07-12 2026-05-01 

数据

structure(list(id = c(1, 2), generic_name = c("ato", "sim"), 
    index_date = c("10/27/2016", "7/12/2017"), ami_pre_date = c("10/20/2015", 
    "5/1/2026")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))

【讨论】:

  • 如果 OP 有更多的非日期列分散在各处,across(ends_with("date"), ...) 之类的可能会更好。
  • 托马斯先生,您说的很对。经您许可,我将把它添加到我的解决方案中。非常感谢。
  • @Gregor 我也是这么想的。如何编写一个以 end_with("date") 结尾的 r 代码。能否举个例子。
  • @PrajwalManiPradhan 您可以使用 Anoushiravan 的答案,但将 -c(1, 2)(表示“在除前两列之外的所有列上操作”)替换为 ends_with("date")(表示“在所有以"日期"")。
  • 谢谢 Anoushiravan 和 Gregor!是的,这个假设是正确和有效的。
【解决方案2】:

base Rsolution 和 lapply

df[grepl("date$", names(df))] <- lapply(df[grepl("date$", names(df))], function(x) as.Date(x, format = "%m/%d/%Y"))

结果:

df
# A tibble: 2 x 4
     id generic_name index_date ami_pre_date
  <dbl> <chr>        <date>     <date>      
1     1 ato          2016-10-27 2015-10-20  
2     2 sim          2017-07-12 2026-05-01 

数据:(感谢@Anoushiravan)

df <- structure(list(id = c(1, 2), generic_name = c("ato", "sim"), 
    index_date = c("10/27/2016", "7/12/2017"), ami_pre_date = c("10/20/2015", 
    "5/1/2026")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))

【讨论】:

  • 谢谢你,克里斯!
【解决方案3】:

我们可以使用anydate

library(anytime)
library(dplyr)
df  %>% 
  mutate(across(contains('date'), anydate))
# A tibble: 2 x 4
#     id generic_name index_date ami_pre_date
#  <dbl> <chr>        <date>     <date>      
#1     1 ato          2016-10-27 2015-10-20  
#2     2 sim          2017-07-12 2026-05-01  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多