如何基于时间对象是否位于其他两个时间对象之间来进行分类变量

时间:2018-08-01 18:54:54

标签: r datetime time datetime-conversion

我正在尝试创建一个新的分类变量,以显示观察时间是否介于从suncalc收集的黎明时间和黄昏时间之间。例如。所有这三个变量当前都属于字符。我已经尝试过as.factor()as.POSIXIt()运算符,但还没有找到神奇的词。

#       Time     dawn     dusk
# 1 19:59:05 05:59:12 21:12:01
# 2 18:46:05 05:51:25 21:21:48
# 3 07:50:21 07:42:54 18:54:53
# 4 10:19:00 04:37:52 21:38:02
# 5 12:16:35 04:39:50 21:39:02
# 6 09:34:26 07:02:49 18:32:55

制作

#       Time     dawn     dusk     daynight
# 1 23:59:05 05:59:12 21:12:01        night
# 2 18:46:05 05:51:25 21:21:48          day
# 3 07:50:21 07:42:54 18:54:53          day
# 4 10:19:00 04:37:52 21:38:02          day
# 5 02:16:35 04:39:50 21:39:02        night
# 6 09:34:26 07:02:49 18:32:55          day

我已经尝试了多个ifelse语句和lubridate函数,但似乎没有任何效果。我可能同时做错了这些事情,或者我只是没有在想什么。任何帮助将不胜感激。谢谢。

免责声明:关于stackoverflow的第一篇文章,如果我做错了,请告诉我以后的任何文章!

1 个答案:

答案 0 :(得分:0)

Base R没有用于仅计时数据的类,但是chron包中没有。

您可以将times包中的chron函数与ifelse一起使用,就像这样...

#read data
x <- read.table(text = "
  Time     dawn     dusk
  23:59:05 05:59:12 21:12:01 
  18:46:05 05:51:25 21:21:48
  07:50:21 07:42:54 18:54:53
  10:19:00 04:37:52 21:38:02
  02:16:35 04:39:50 21:39:02
  09:34:26 07:02:49 18:32:55
", header = TRUE)

library(chron) #for times

#coerce character-formatted times to times (time-only) class
x$Time <- times(x$Time)
x$dawn <- times(x$dawn)
x$dusk <- times(x$dusk)

#use ifelse to assign conditional label
x$daynight <- with(x, ifelse(Time >= dawn & Time < dusk, "day", "night"))

#> x
#      Time     dawn     dusk daynight
#1 23:59:05 05:59:12 21:12:01    night
#2 18:46:05 05:51:25 21:21:48      day
#3 07:50:21 07:42:54 18:54:53      day
#4 10:19:00 04:37:52 21:38:02      day
#5 02:16:35 04:39:50 21:39:02    night
#6 09:34:26 07:02:49 18:32:55      day

另请参阅相关帖子:

Want only the time portion of a date-time object in R

Storing time without date but not as class character