[英]How do I create a new variable with values that base on the difference between two time points?
我有两个变量代表唤醒时间和 go 以分钟为单位的睡眠时间(例如:如果人 A 在 00:40 上床睡觉,那么 sleep_min 将是“40”)。
id day wake_min sleep_min
1 ADD15 1 518 40
2 ADD15 2 540 45
3 ADD15 3 570 80
4 ADD15 4 487 50
5 ADD15 5 582 73
6 AHK1 1 405 1435
7 AHK1 2 611 1402
然后我有第二个数据集,每个人的每一天和一分钟都有一行。 所以 Person ADD15 第 1 天有 1440 行,第 2 天有 1440 行,等等。
id day minute
1: ADD15 1 1
2: ADD15 1 2
3: ADD15 1 3
4: ADD15 1 4
5: ADD15 1 5
6: ADD15 1 6
...
我想为第二个数据集创建一个名为“state”的新变量。 这个应该代表一个人是睡着还是醒着。 该变量应编码为 1 表示睡眠,0 表示清醒。 对于人 ADD15 的第 1 天,40 到 518 分钟之间的所有行的值应为“1”,第 1 天的其他行为“0”。
我用 teh ifelse function 尝试了一些东西,但到目前为止没有任何效果。
对于我的问题,我真的很感激一些帮助和建议!
提前致谢!!
您可以merge
数据集,然后检查分钟是否在睡眠seq
中。
dat3 <- merge(dat1, dat2)
dat3$asleep <-
+mapply(`%in%`,
dat3$minute,
apply(dat3[3:4], 1, function(x) do.call(seq, as.list(unname(x))))
)
head(dat3, 20)
# id day wake_min sleep_min minute asleep
# 1 ADD15 1 518 40 264 1
# 2 ADD15 1 518 40 265 1
# 3 ADD15 1 518 40 262 1
# 4 ADD15 1 518 40 263 1
# 5 ADD15 1 518 40 272 1
# 6 ADD15 1 518 40 273 1
# 7 ADD15 1 518 40 274 1
# 8 ADD15 1 518 40 275 1
# 9 ADD15 1 518 40 276 1
# 10 ADD15 1 518 40 277 1
# 11 ADD15 1 518 40 278 1
# 12 ADD15 1 518 40 266 1
# 13 ADD15 1 518 40 267 1
# 14 ADD15 1 518 40 268 1
# 15 ADD15 1 518 40 269 1
# 16 ADD15 1 518 40 270 1
# 17 ADD15 1 518 40 271 1
# 18 ADD15 1 518 40 1 0
# 19 ADD15 1 518 40 2 0
# 20 ADD15 1 518 40 3 0
数据:
dat1 <- structure(list(id = c("ADD15", "ADD15", "ADD15", "ADD15", "ADD15",
"AHK1", "AHK1"), day = c(1L, 2L, 3L, 4L, 5L, 1L, 2L), wake_min = c(518L,
540L, 570L, 487L, 582L, 405L, 611L), sleep_min = c(40L, 45L,
80L, 50L, 73L, 1435L, 1402L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7"))
dat2 <- expand.grid(id=unique(dat1$id), day=1:3, minute=1:1440)
非常感谢您的快速答复!
到目前为止,这有效,但仍然存在一个问题。 如果该人在午夜后入睡,则 function 可以完美运行。 但如果这个人在午夜之前上床睡觉,它就不会。
id day wake_min sleep_min minute sleep
1 AHK1 1 405 1435 395 FALSE
2 AHK1 1 405 1435 396 FALSE
3 AHK1 1 405 1435 397 FALSE
4 AHK1 1 405 1435 398 FALSE
5 AHK1 1 405 1435 399 FALSE
6 AHK1 1 405 1435 400 FALSE
7 AHK1 1 405 1435 401 FALSE
8 AHK1 1 405 1435 402 FALSE
9 AHK1 1 405 1435 403 FALSE
10 AHK1 1 405 1435 404 FALSE
11 AHK1 1 405 1435 405 TRUE
12 AHK1 1 405 1435 406 TRUE
这个人在前一天的 1435 分钟睡觉。 因此,对于第 1 分钟,0 到 405 应该是 TRUE。 我不知道如何处理这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.