Как мне создать новую переменную со значениями, основанными на разнице между двумя временными точками?

#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 должна быть ИСТИННОЙ. Я не знаю, как с этим справиться.