繁体   English   中英

自定义函数,用于在df中查找日期列,并在R中将名称标准化为“ date”

[英]Custom function to find date column in df and standardize name to “date” in R

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

  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的任何类重命名为“ date”,但理想情况下,我还希望该函数可以解决以下示例,其中日期列的类别可以是字符或因子。

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

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

根据描述,我们可以检查特定列是否为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))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM