gpt4 book ai didi

r - 将文件读入 data.frame 时自动检测日期列

转载 作者:行者123 更新时间:2023-12-04 01:10:32 24 4
gpt4 key购买 nike

读取文件时,read.table函数用途 type.convert区分逻辑、整数、数字、复数或因子列并相应地存储它们。

我想在组合中添加日期,以便可以自动识别包含日期的列并将其解析为 Date对象。只应识别几种日期格式,例如

date.formats <- c("%m/%d/%Y", "%Y/%m/%d")

下面是一个例子:
fh <- textConnection(

"num char date-format1 date-format2 not-all-dates not-same-formats
10 a 1/1/2013 2013/01/01 2013/01/01 1/1/2013
20 b 2/1/2013 2013/02/01 a 2013/02/01
30 c 3/1/2013 NA b 3/1/2013"
)

和输出
dat <- my.read.table(fh, header = TRUE, stringsAsFactors = FALSE,
date.formats = date.formats)
sapply(dat, class)

会给:
num              => numeric
char => character
date-format1 => Date
date-format2 => Date
not-all-dates => character
not-same-formats => character # not a typo: date format must be consistent

在我从头开始实现它之前,包中是否已经提供了这样的东西?或者也许有人已经给了它一个破解(或愿意)并愿意在这里分享他的代码?谢谢。

最佳答案

您可以使用 lubridate::parse_date_time ,这有点严格(并创建 POSIXlt )数据。

我还添加了更多对现有 NA 值的检查(可能没有必要)。

例如

library(lubridate)
my.read.table <- function(..., date.formats = c("%m/%d/%Y", "%Y/%m/%d")) {
dat <- read.table(...)
for (col.idx in seq_len(ncol(dat))) {
x <- dat[, col.idx]
if(!is.character(x) | is.factor(x)) next
if (all(is.na(x))) next
for (format in date.formats) {
complete.x <- !(is.na(x))
d <- as.Date(parse_date_time(as.character(x), format, quiet = TRUE))
d.na <- d[complete.x]
if (any(is.na(d.na))) next
dat[, col.idx] <- d
}
}
dat

}

dat <- my.read.table(fh, stringsAsFactors = FALSE,header=TRUE)

str(dat)
'data.frame': 3 obs. of 6 variables:
$ num : int 10 20 30
$ char : chr "a" "b" "c"
$ date.format1 : Date, format: "2013-01-01" "2013-02-01" "2013-03-01"
$ date.format2 : Date, format: "2013-01-01" "2013-02-01" NA
$ not.all.dates : chr "2013/01/01" "a" "b"
$ not.same.formats: chr "1/1/2013" "2013/02/01" "3/1/2013"

另一种方法是使用 options(warn = 2)在函数内并包装 parse_date_time(...)在 try 语句中
my.read.table <- function(..., date.formats = c("%m/%d/%Y", "%Y/%m/%d")) {
dat <- read.table(...)
owarn <-getOption('warn')
on.exit(options(warn = owarn))
options(warn = 2)
for (col.idx in seq_len(ncol(dat))) {
x <- dat[, col.idx]
if(!is.character(x) | is.factor(x)) next
if (all(is.na(x))) next
for (format in date.formats) {
d <- try(as.Date(parse_date_time(as.character(x), format)), silent= TRUE)

if (inherits(d, 'try-error')) next
dat[, col.idx] <- d
}
}
dat

}

关于r - 将文件读入 data.frame 时自动检测日期列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18390674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com