[英]Custom function to find date column in df and standardize name to “date” in R
我的许多工作都涉及将新数据集合并为旧数据集,但是我在主数据集中拥有的标准化“日期”名称通常与新原始数据中的日期名称不匹配(可能是“日期”,“日期” ”,“ Time.Period”等)。 为了使生活更轻松,我想创建一个自定义函数,该函数将:
以下是几个可使用的数据集:
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
类的列,但不适用于您在问题末尾询问的factor
或character
类的列,因此以下内容可能对您有用。
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.