如何根据大部分时间在哪里为新变量编码?

活泼的

我有一个DateTime数据帧用于睡眠数据。我想根据大多数睡眠发生在截止时间的上午8点和晚上8点,将“混合”变量更改为“白天”睡眠或“晚上”睡眠。

    #Current database
    id<-c("m1","m1","m1","m2","m2","m2","m3","m4","m4")
    x<-c("2020-01-03 10:00:00","2020-01-03 16:00:00","2020-01-03 19:20:00","2020-01-05 10:00:00","2020-01-05 15:20:00","2020-01-05 20:50:00","2020-01-06 06:30:00","2020-01-08 06:30:00","2020-01-08 07:50:00")
    start<-strptime(x,"%Y-%m-%d %H:%M:%S")
    y<-c("2020-01-03 16:00:00","2020-01-03 19:20:00","2020-01-03 20:50:00","2020-01-05 15:20:00","2020-01-05 20:50:00","2020-01-05 22:00:00","2020-01-06 07:40:00","2020-01-08 07:50:00","2020-01-08 08:55:00")
    end<-strptime(y,"%Y-%m-%d %H:%M:%S")
    mydata<-data.frame(id,start,end)

    #Current ouput
    df1<-mydata %>%
    mutate_at(vars(start, end), ymd_hms) %>%
    mutate(start_hour = hour(start), 
     end_hour = hour(end), 
     day.night = case_when(start_hour >= 8 & end_hour >= 8 & end_hour < 20 ~ "day", 
                           start_hour >= 20 &  (end_hour < 8 | end_hour <= 23) |
                             (start_hour < 8 & end_hour < 8)~ "night",
                           TRUE ~ "mixed"))



    id               start                 end start_hour end_hour day.night
    1 m1 2020-01-03 10:00:00 2020-01-03 16:00:00         10       16       day
    2 m1 2020-01-03 16:00:00 2020-01-03 19:20:00         16       19       day
    3 m1 2020-01-03 19:20:00 2020-01-04 20:50:00         19       20     mixed
    4 m2 2020-01-05 10:00:00 2020-01-05 15:20:00         10       15       day
    5 m2 2020-01-05 15:20:00 2020-01-05 20:50:00         15       20     mixed
    6 m2 2020-01-05 20:50:00 2020-01-05 22:00:00         20       22     night
    7 m3 2020-01-06 06:30:00 2020-01-06 07:40:00          6        7     night
    8 m4 2020-01-08 06:30:00 2020-01-08 07:50:00          6        7     night
    9 m4 2020-01-08 07:50:00 2020-01-08 08:55:00          7        8     mixed

当前,当睡眠中断临界值时,新变量输出将设置为“混合”。

编辑:我想根据睡眠时间在哪里混合使用睡眠数据,即在第3行中:40分钟是白天,而50分钟是晚上,所以现在将是= night,在第5行:4hrs白天是40分钟,晚上是50分钟,所以现在=天。

马特

使用lubridatedplyr,您可以使用进行白天和黑夜的分类if_else我还根据评论调整了数据。

library(lubridate)
library(dplyr)

#data
id <- c("m1", "m1", "m1", "m2", "m2", "m2", "m3", "m4", "m4")
x <- c("2020-01-03 10:00:00", "2020-01-03 16:00:00", "2020-01-03 19:20:00", "2020-01-05 10:00:00", "2020-01-05 15:20:00", "2020-01-05 20:50:00", "2020-01-06 06:30:00", "2020-01-08 06:30:00", "2020-01-08 07:50:00")
start <- strptime(x, "%Y-%m-%d %H:%M:%S")
y <- c("2020-01-03 16:00:00", "2020-01-03 19:20:00", "2020-01-03 00:50:00", "2020-01-05 15:20:00", "2020-01-05 20:50:00", "2020-01-05 22:00:00", "2020-01-06 07:40:00", "2020-01-08 07:50:00", "2020-01-08 08:55:00")
end <- strptime(y, "%Y-%m-%d %H:%M:%S")
mydata <- data.frame(id, start, end)

#start and end times
daystart <- as.POSIXct('08:00:00', format = "%T")
nightstart <- as.POSIXct('20:00:00', format = "%T")
dayend <- as.POSIXct('19:59:00', format = "%T")
nightend <- as.POSIXct('07:59:00', format = "%T")

df1 <- mydata %>% mutate(start1 = as.POSIXct(sub("\\d+-\\d+-\\d+", Sys.Date(), start)),
                                        end1 = as.POSIXct(sub("\\d+-\\d+-\\d+", Sys.Date(), end)),
                                        day = ifelse(start1 > daystart & start1 < dayend & end1 < dayend & end1 > daystart, as.interval(start1, end1),
                                                      ifelse(start1 > daystart & start1 < dayend & end1 < dayend & end1 < daystart, as.interval(start1, dayend),
                                                      ifelse(start1 > daystart & start1 < dayend & end1 > dayend, as.interval(start1, dayend),
                                                      ifelse(end1 > daystart & end1 < dayend, as.interval(daystart, end1), 0)))),
                                        night = ifelse(end1 > nightstart, as.interval(nightstart, end1),
                                                      ifelse(start1 < nightend & end1 > nightend, as.interval(start1, nightend),
                                                      ifelse(start1 < nightend & end1 < nightend, as.interval(start1, end1),                                                      
                                                      ifelse(start1 > nightstart & end1 < nightend, as.interval(start1, end1),
                                                      ifelse(start1 < nightstart & end1 < daystart, as.interval(nightstart, end1), 0))))),
                                        day.night = ifelse(abs(day) > abs(night), "day", "night"))

df1 %>% select(names(mydata), day.night)

#  id               start                 end day.night
#1 m1 2020-01-03 10:00:00 2020-01-03 16:00:00       day
#2 m1 2020-01-03 16:00:00 2020-01-03 19:20:00       day
#3 m1 2020-01-03 19:20:00 2020-01-03 00:50:00     night
#4 m2 2020-01-05 10:00:00 2020-01-05 15:20:00       day
#5 m2 2020-01-05 15:20:00 2020-01-05 20:50:00       day
#6 m2 2020-01-05 20:50:00 2020-01-05 22:00:00     night
#7 m3 2020-01-06 06:30:00 2020-01-06 07:40:00     night
#8 m4 2020-01-08 06:30:00 2020-01-08 07:50:00     night
#9 m4 2020-01-08 07:50:00 2020-01-08 08:55:00       day

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

wlan0 大部分时间都不工作

为什么Logger大部分时间都是静态的?

Kinect 2-AcquireLatestFrame()大部分时间失败

Firebase iOS大部分时间不工作

我的图表在绘制时被切除(大部分时间)

RouterLink似乎大部分时间只是重新加载当前页面

使用多处理的程序大部分时间都花在线程锁上?

MKPolygonRenderer不填充多边形(大部分时间)

安装程序花费大部分时间删除应用程序和库

二进制加法器仅在*大部分时间*工作

selenium python 的 md-option,大部分时间都失败了

从youtube获取链接时,尝试查找第一个链接时大部分时间为空列表(Python)

为什么我的程序大部分时间都处于睡眠状态,却占用了如此多的 CPU 时间?

通过Comparator <T>进行Java排序的大部分时间都用在compare(Object,Object)中

删除行的大部分值为零

如何根据天气条件显示图标。我完成了大部分代码,在结束部分需要帮助

如何使用 strpos 匹配大部分单词?

我如何才能改善大部分“退化”的内部联接?

当对象acl是公共的时,如何将S3存储桶策略设置为(大部分)私有?

在不使用CPU风扇的i7 3630M笔记本电脑上运行24小时(大部分时间都是在轻载状态下)-可能出什么问题了吗?

Visual VM 能否检测出哪个代码块占用了大部分处理时间?

选择学生在最短的时间内完成大部分项目

在CPU上计算矩阵会占用大部分帧时间

Xcode 10 iOS应用程序构建,“隐藏”任务花费了大部分构建时间

数据包丢失(大部分)

来自两个变量列的 Matplotlib 条形图 - Pandas 数据操作(大部分)

当大部分项目模块/代码文件使用/执行相同的代码部分时,提供不同的体系结构级别的设计解决方案

如何减去特定的部分时间

如何在包含谁在 mysql 中写过大部分书的列表中找到作者