2014-10-16 14 views
17

R ma is.vector, is.list, is.integer, is.double, is.numeric, is.factor, is.character, itd. Dlaczego nie ma is.POSIXct, is.POSIXlt lub is.Date?niezawodny sposób, aby wykryć, czy kolumna w data.frame is.POSIXct

Potrzebuję niezawodnego sposobu na wykrycie obiektu POSIXct, a class(x)[1] == "POSIXct" wydaje się być naprawdę ... brudny.

+3

Jeśli po prostu sprawdzisz klasę, "dziedziczenie" prawdopodobnie będzie czystsze. – joran

Odpowiedz

17

Chciałbym osobiście wystarczy użyć inherits jak joran sugerowane. Można go użyć do utworzenia własnej funkcji 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 
12

Pakiet lubridate ma is.POSIXt, is.POSIXct, is.POSIXlt i is.Date funkcje.

+0

Oczywiście. Próbuję to zrobić w bazie R i zapomniałem o lubridate. – Zach

+1

Jeśli 'x <- as.POSIXlt (Sys.time())', to 'is.POSIXt (x)' ma wartość 'TRUE', mimo że' x' nie jest POSIXct ... –

+0

'is.POSIXt' zwraca TRUE jeśli klasa jest albo "POSIXlt" lub "POSIXct". – eipi10

3

Możesz spróbować is(). Tak czy inaczej opierają się na tym i lubridate funkcje.

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 
+1

Nie jest to naprawdę ważne w tym przypadku, ale 'dziedziczy' został zaprojektowany dla S3 i przechodzi bezpośrednio do kodu C, podczas gdy' jest' musi obsługiwać S4 i wykonuje kilka wywołań do innych funkcji R. –

Powiązane problemy