【问题标题】:How do I create a new variable with values that base on the difference between two time points?如何创建一个新变量,其值基于两个时间点之间的差异?
【发布时间】:2020-12-16 11:45:58
【问题描述】:

我有两个变量分别代表起床时间和入睡时间(以分钟为单位)(例如:如果人 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”。

我用 ifelse 函数尝试了一些东西,但到目前为止没有任何效果。

对于我的问题,我非常感谢一些帮助和建议!

提前致谢!!

【问题讨论】:

    标签: r variables conditional-statements calculated-columns difference


    【解决方案1】:

    您可以merge 数据集,然后检查分钟是否处于睡眠状态sequence。

    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 应该是 TRUE。我不知道如何处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        • 2020-02-18
        • 1970-01-01
        相关资源
        最近更新 更多