检测data.frame中的列是否为.POSIXct的可靠方法

Zac*_*ach 24 datetime r posixct

R有is.vector,is.list,is.integer,is.double,is.numeric,is.factor,is.character,等为什么没有is.POSIXct,is.POSIXlt还是is.Date

我需要一种可靠的方法来检测POSIXct物体,class(x)[1] == "POSIXct"看起来真的......很脏.

Jos*_*ich 24

我个人只是inherits按照joran的建议使用.您可以使用它来创建自己的is.POSIXct功能.

# functions
is.POSIXct <- function(x) inherits(x, "POSIXct")
is.POSIXlt <- function(x) inherits(x, "POSIXlt")
is.POSIXt <- function(x) inherits(x, "POSIXt")
is.Date <- function(x) inherits(x, "Date")
# data
d <- data.frame(pct = Sys.time())
d$plt <- as.POSIXlt(d$pct)
d$date <- Sys.Date()
# checks
sapply(d, is.POSIXct)
#   pct   plt  date 
#  TRUE FALSE FALSE 
sapply(d, is.POSIXlt)
#   pct   plt  date 
# FALSE  TRUE FALSE 
sapply(d, is.POSIXt)
#   pct   plt  date 
#  TRUE  TRUE FALSE 
sapply(d, is.Date)
#   pct   plt  date 
# FALSE FALSE  TRUE 
Run Code Online (Sandbox Code Playgroud)


eip*_*i10 17

lubridate包有is.POSIXt,is.POSIXct,is.POSIXlt,和is.Date功能.


Ric*_*ven 7

你可以试试is().无论如何,这是lubridate功能is.Dateis.POSIX*依赖.

x <- Sys.time()
class(x)
# [1] "POSIXct" "POSIXt" 
is(x, "Date")
#v[1] FALSE
is(x, "POSIXct")
# [1] TRUE

y <- Sys.Date()
class(y)
# [1] "Date"
is(y, "POSIXct")
# [1] FALSE
is(y, "Date")
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • 并非在这种情况下真的很重要,但是`inherits`是为S3而设计的,直接用于C代码,而`is`需要处理S4并对其他R函数进行多次调用. (3认同)