r - 如何在 R 中找到两次之间的中间时间,有时是一夜之间,有时是同一天,但我没有日期?
问题描述
我想在我的 6000 名参与者的数据框中找到 SLQ300(睡眠时间)和 SLQ310(唤醒时间)列中两次之间的中间时间。补充:我已经在 SLD012 列中有持续时间。因此,如果我们可以将一半的持续时间添加到睡眠时间,那就太好了。
例如。在第一行中,它应该是 23:00 和 07:00 之间的中点,即 03:00。
而在第 9 行,应该是在 01:00 到 06:00 之间,也就是 03:30。
先感谢您!
解决方案
尝试这个:
time2num <- function(x) {
vapply(strsplit(x, ':'), function(y) sum(as.numeric(y) * c(60, 1)),
numeric(1), USE.NAMES=FALSE)
}
# sample data
dat <- data.frame(id=1:2, tm1=c("23:00","01:00"), tm2=c("07:00","06:00"))
# the code
dat[,c("tm1n","tm2n")] <- lapply(dat[,c("tm1","tm2")], time2num)
dat
# id tm1 tm2 tm1n tm2n
# 1 1 23:00 07:00 1380 420
# 2 2 01:00 06:00 60 360
with(dat, ifelse(tm1n > tm2n, 24*60, 0) + tm2n - tm1n)
# [1] 480 300 ### minutes
或者您可以使用模数:
with(dat, tm2n - tm1n) %% (12*60)
(虽然我还没有在各种组合中测试过它)。
和中间时间:
format(as.POSIXct(paste(Sys.Date(), dat$tm1)) +
60*with(dat, ifelse(tm1n > tm2n, 24*60, 0) + tm2n - tm1n)/2,
format="%H:%M")
# [1] "03:00" "03:30"
推荐阅读
- mysql - 如何在我的表格中找到平均销售额高于表格平均值的所有邮政编码?
- python - 将图像插入到基材上
- react-native - REACT Native Modal 透明道具在 Android 上出现问题
- sql-server - 如何根据 SQL Server 中的条件从行转列到列?
- vba - 如何使用 RubberDuck '@PredeclaredID 设置属性 VB_PredeclaredId
- java - InMemoryUserDetailsManager updateUser 调用后未获取更新的密码
- reactjs - 在打字稿中定义通用的 redux 动作创建者
- c++ - C++ 模板可以检测特定类型的成员吗?
- java - 如何在java中的一行中打印一个字符串块
- php - 标头未添加到特定路径 NGINX,Laravel