【问题标题】:find all columns with character formated date values查找具有字符格式日期值的所有列
【发布时间】:2016-09-02 01:27:49
【问题描述】:

我有一个从 sqlite 数据库表创建的 R 数据框。该数据有许多现在是字符列的日期时间列。我想将它们批量转换为数据框中的日期列。

我可以像这样一次写一列:

loan$Maturity <- as.Date(gsub(', 12:00:00 AM', '', loan$Maturity), "%m/%d/%y")

我可以对所有作为因子的列进行大规模更新。作为日期值的每一列都包含

i <- sapply(loan, is.factor)
loan[i] <- lapply(loan[i], as.character)

如何获取包含文本“, 12:00:00 AM”的每一列,然后使用函数 as.Date() 更改所有字段以将所有字符值转换为日期值。

【问题讨论】:

  • 如果一个列包含, 12:00:00 AM 的单个实例,或者每一行都必须包含它,那么它是否匹配?
  • 为什么不在整个数据框上使用lapply,并有条件地转换你想要的列?
  • 不是每一列都有匹配的文本或有值的行,有些是不适用的
  • 这并不能真正回答问题。列中是否存在 single 匹配项表明该列应被视为日期?
  • 是的,单个匹配意味着该列是日期列。对不起,我没有理解你的问题

标签: r sqlite datetime


【解决方案1】:

此解决方案假定(正如@Tim 所要求的)列中, 12:00:00 AM 的单个实例构成转换。

我提供了两个版本来进行检查和转换。第一个使用vapply 查找要转换的列,然后将它们转换为lapply。第二个版本在单个lapply 中进行检查和转换。

#create dummy data.frame
df <- data.frame(a=1, b='1/1/92, 12:00:00 AM')
#check which columns have ', 12:00:00 AM' in them
convertCols <- vapply(df, function(col) sum(grepl(', 12:00:00 AM', col)) > 0, logical(1))
#convert only columns that contained ', 12:00:00 AM' using your conversion function
df[convertCols] <- lapply(df[convertCols], function(dates) as.Date(gsub(', 12:00:00 AM', '', dates), "%m/%d/%y"))

#create dummy data.frame
df <- data.frame(a=1, b='1/1/92, 12:00:00 AM')
#done in single lapply
df[] <- lapply(df[], function(col) {
  if(sum(grepl(', 12:00:00 AM', col)) > 0) as.Date(gsub(', 12:00:00 AM', '', col), "%m/%d/%y") else col
})

如果列中的每个元素都必须包含 , 12:00:00 AM 才能构成转换,则检查将切换到 sum(grepl(', 12:00:00 AM', col)) == length(col) 而不是 sum(grepl(', 12:00:00 AM', col)) &gt; 0

【讨论】:

  • 这正是我所需要的。我没有考虑 vapply 和逻辑的使用。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多