可靠的方法来检测数据框中的列是否为.POSIXct类型

33

R有is.vectoris.listis.integeris.doubleis.numericis.factoris.character等函数,为什么没有is.POSIXctis.POSIXltis.Date函数呢?

我需要一种可靠的方式来检测POSIXct对象,而class(x)[1] == "POSIXct"似乎很...不太好。


3
如果您只是检查类,那么使用inherits可能会更加简洁。 - joran
3个回答

35

我个人会像joran建议的那样,只使用inherits。你可以使用它来创建自己的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 

21

lubridate 包提供了 is.POSIXtis.POSIXctis.POSIXltis.Date 函数。


当然可以。我试图在基本R中完成这个任务,忘记了lubridate。 - Zach
1
如果 x <- as.POSIXlt(Sys.time()),那么即使 x 不是 POSIXct,is.POSIXt(x) 也会返回 TRUE... - Joshua Ulrich
如果类是 POSIXltPOSIXct,则 is.POSIXt 返回 TRUE。 - eipi10
是的,那就是我的观点。它不能帮助你区分 POSIXct 和 POSIXlt。 - Joshua Ulrich
澄清已添加。谢谢。 - eipi10

9
你可以尝试使用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

4
虽然这个案例似乎并不重要,但 inherits 是为了 S3 而设计的,可以直接进入 C 代码,而 is 则需要处理 S4,并调用其他 R 函数。 - Joshua Ulrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接