【问题标题】:Custom function to find date column in df and standardize name to "date" in R自定义函数在 df 中查找日期列并将名称标准化为 R 中的“日期”
【发布时间】:2017-10-25 17:56:04
【问题描述】:

我的很多工作都涉及将新数据集与旧数据集合并,但我在主数据集中拥有的标准化“日期”名称通常与新原始数据中的日期名称不匹配(可能是“日期” 、“日”、“时间.时期”等...)。为了让生活更轻松,我想创建一个自定义函数:

  1. 检测新旧数据集中的日期列
  2. 将列名标准化为“日期”(通常原始新数据会与名为“日期”或“日”或“时间段”等的日期列一起出现。)

这里有几个数据集可供使用:

Dates_A <- seq(from = as.Date("2017-01-01"), to = as.Date("2017-12-31"), by = "day")
Dates_B <- seq(from = as.Date("2017-01-01"), to = as.Date("2017-12-31"), by = "day")
Numbers <- rnorm(365)

df_a <- data.frame(Dates_A, Numbers)
df_b <- data.frame(Dates_B, Numbers)

我的第一个倾向是尝试一个 for 循环,该循环按索引搜索列的类,并自动将 Class = Date 重命名为“日期”,但理想情况下,我也希望使用该函数来解决示例下面,其中日期列的类可以是字符或因子。

Dates_C <- as.character(Dates_B)
df_c <- data.frame(Dates_C, Numbers)
df_d <- data.frame(Dates_C, Numbers, stringsAsFactors = FALSE)

如果您有任何想法或可以为我指明正确的方向,我将不胜感激!

【问题讨论】:

    标签: r date


    【解决方案1】:

    根据描述,我们可以检查特定列是否为Date类,获取逻辑索引并将该列的name分配给'date'

    is.date <- function(x) inherits(x, 'Date')
    names(df_a)[sapply(df_a, is.date)] <- 'date'
    

    假设数据集中只有一个“日期”列。如果有多个“日期”列,为避免列名重复,请使用make.unique

    names(df_a) <- make.unique(names(df_a))
    

    【讨论】:

      【解决方案2】:

      akrun 的解决方案适用于 Date 类的列,但不适用于 factorcharacter 类的列,就像您在问题末尾提出的那样,所以以下内容可能对您有用。

      library(lubridate)
      
      checkDates <- function(x) {
          op <- options(warn = -1)  # needed to keep stderr clean
          on.exit(options(op))      # reset to original value
          !all(is.na(ymd(x)))
      }
      
      names(df_c)[sapply(df_c, checkDates)] <- 'date'
      names(df_d)[sapply(df_d, checkDates)] <- 'date'
      

      请注意,也许您可​​以从这两种解决方案中获得一些灵感,并将它们组合成一个功能。如果inherits 返回TRUE 则全部完成,否则尝试ymd

      【讨论】:

        猜你喜欢
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 1970-01-01
        相关资源
        最近更新 更多