【问题标题】:Transform/mirror the variable "remaining day" to "number of days past"将变量“剩余天数”转换/镜像为“过去天数”
【发布时间】:2021-05-13 02:45:53
【问题描述】:

每天都会收集一系列行为测量结果。在某些情况下,未观察到/未测量行为的开始。然而,行为的结束是针对所有观察到的组。因此,变量“剩余天数”简单地倒计时,直到最后一次观察到行为的最后一天(第 1 天)。计算行为开始的天数感觉更自然,我想知道如何将变量“剩余天数”转换为“过去天数”是可能的?而不是还剩 6 天,还剩 5 天等。我想得到一个计算第 1 天、第 2 天等的列。我如何为每个组镜像这些日子,以获得以下输出。

data <- data.frame(Group = as.factor(c("1", "1", "1", "1", 
                                    "1", "1", "2", "2",
                                    "2", "2")),
              remaining.days = as.factor(c("6", "5", "4", "3", 
                                         "2", "1", "4", "3",
                                         "2", "1")),
              behaviour.length = as.numeric(c("21", "42", "12", "33", 
                                                  "12", "32", "15", "65",
                                                  "43", "21")))

预期输出

> data
   Group remaining.days behaviour.length
1      1              1               21
2      1              2               42
3      1              3               12
4      1              4               33
5      1              5               12
6      1              6               32
7      2              1               15
8      2              2               65
9      2              3               43
10     2              4               21

【问题讨论】:

    标签: r


    【解决方案1】:

    为什么不只是反转每个Group的值

    transform(data, remaining.days = ave(remaining.days, Group, FUN = rev))
    
    #   Group remaining.days behaviour.length
    #1      1              1               21
    #2      1              2               42
    #3      1              3               12
    #4      1              4               33
    #5      1              5               12
    #6      1              6               32
    #7      2              1               15
    #8      2              2               65
    #9      2              3               43
    #10     2              4               21
    

    这也可以写成dplyrdata.table

    #dplyr
    library(dplyr)
    
    data %>%
      group_by(Group) %>%
      mutate(remaining.days = rev(remaining.days)) %>%
      ungroup
    
    #data.table
    library(data.table)
    setDT(data)[, remaining.days := rev(remaining.days), Group]
    

    【讨论】:

      【解决方案2】:

      我们可以使用row_number

      library(dplyr)
      data %>% 
        group_by(Group) %>% 
        mutate(remaining.days = row_number()) %>%
        ungroup
      

      -输出

      # A tibble: 10 x 3
      #   Group remaining.days behaviour.length
      #   <fct>          <int>            <dbl>
      # 1 1                  1               21
      # 2 1                  2               42
      # 3 1                  3               12
      # 4 1                  4               33
      # 5 1                  5               12
      # 6 1                  6               32
      # 7 2                  1               15
      # 8 2                  2               65
      # 9 2                  3               43
      #10 2                  4               21
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 2020-01-12
        • 2013-06-26
        相关资源
        最近更新 更多