#r #variables #conditional-statements #calculated-columns #difference
#r #переменные #условные операторы #вычисляемые столбцы #разница
Вопрос:
У меня есть две переменные, которые представляют время пробуждения и время отхода ко сну в минутах (пример: если человек А лег спать в 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 имеет 1440 строк для дня 1, 1440 для дня 2 и т.д.
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 для бодрствования.
В случае дня 1 person ADD15, все строки для минут между 40 и 518 должны иметь значение «1», а другие строки для дня 1 «0».
Я пробовал некоторые вещи с помощью функции ifelse, но пока ничего не получалось.
Я был бы очень признателен за помощь и советы по моей проблеме!
Заранее спасибо!!
Ответ №1:
Вы могли 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)
Ответ №2:
Большое вам спасибо за быстрый ответ!
До сих пор это работало, но все еще есть одна проблема. Если человек лег спать после полуночи, функция работает отлично. Но если человек лег спать до полуночи, это не так.
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 должна быть ИСТИННОЙ. Я не знаю, как с этим справиться.