【问题标题】:repeating a number n times, then a different number for the remainder of the rows in R重复一个数字 n 次,然后为 R 中的其余行重复一个不同的数字
【发布时间】:2021-12-07 19:59:22
【问题描述】:

我有一个数据集,其中每一行都是对患者的每月观察,监测他们是否对某种疾病检测呈阳性(状态)。

我知道他们被诊断出的月份(即每个 ID 的行号 - TimeToDx),我想做的是有一个二进制指标,从 TimeToDx 中指示的观察月份开始,从 0 切换到 1。

基本上我需要通过 TimeToDx - 1 复制 0,然后为其余行复制每个 ID 的 1。

这是一些示例数据 - 没有填充状态指示器:

 ID TimeToDx    Status
10425   2   
10425   2   
10425   2   
10425   2   
10667   3   
10667   3   
10667   3   
10667   3   
10667   3   
10686   2   
10686   2   
10686   2   
10686   2   
10686   2   
17096   5   
17096   5   
17096   5   
17096   5   
17096   5   

这是我想看到的:

ID  TimeToDx    Status
10425   2       0
10425   2       1
10425   2       1
10425   2       1
10667   3       0
10667   3       0
10667   3       1
10667   3       1
10667   3       1
10686   2       0
10686   2       1
10686   2       1
10686   2       1
10686   2       1
17096   5       0
17096   5       0
17096   5       0
17096   5       0
17096   5       1

任何帮助将不胜感激。

【问题讨论】:

    标签: r replication


    【解决方案1】:

    这是dplyr 的一种方法。在每个 ID 中分组,我们将该组中的行与TimeToDx 进行比较。 TRUE x 1 = 1,FALSE x 1 = 0。可以交替使用mutate(Status = if_else(row_number() >= TimeToDx, 1, 0))

    library(dplyr)
    df %>%
      group_by(ID) %>%
      mutate(Status = 1 * (row_number() >= TimeToDx)) %>%
      ungroup()
    

    【讨论】:

    • 哦,我明白了。非常感谢乔恩,为我工作。
    【解决方案2】:
    df <- structure(list(ID = c(10425L, 10425L, 10425L, 10425L, 10667L, 
                                10667L, 10667L, 10667L, 10667L, 10686L, 10686L, 10686L, 10686L, 
                                10686L, 17096L, 17096L, 17096L, 17096L, 17096L), 
                         TimeToDx = c(2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 2L, 2L,
                                      2L, 2L, 2L, 5L, 5L, 5L, 5L, 5L)),
                    class = "data.frame", row.names = c(NA, -19L))
    
    library(tidyverse)
    df %>%
      group_by(ID) %>% 
      mutate(Status = +((row_number() %/% TimeToDx) != 0)) %>% 
      ungroup()
    #> # A tibble: 19 x 3
    #>       ID TimeToDx id_row
    #>    <int>    <int>  <int>
    #>  1 10425        2      0
    #>  2 10425        2      1
    #>  3 10425        2      1
    #>  4 10425        2      1
    #>  5 10667        3      0
    #>  6 10667        3      0
    #>  7 10667        3      1
    #>  8 10667        3      1
    #>  9 10667        3      1
    #> 10 10686        2      0
    #> 11 10686        2      1
    #> 12 10686        2      1
    #> 13 10686        2      1
    #> 14 10686        2      1
    #> 15 17096        5      0
    #> 16 17096        5      0
    #> 17 17096        5      0
    #> 18 17096        5      0
    #> 19 17096        5      1
    

    reprex package (v2.0.1) 于 2021 年 10 月 21 日创建

    data.table

    使用@Jon Spring 的解决方案

    library(data.table)
    setDT(df)[, Status := +(rowid(ID) >= TimeToDx)][]
    #>        ID TimeToDx Status
    #>  1: 10425        2      0
    #>  2: 10425        2      1
    #>  3: 10425        2      1
    #>  4: 10425        2      1
    #>  5: 10667        3      0
    #>  6: 10667        3      0
    #>  7: 10667        3      1
    #>  8: 10667        3      1
    #>  9: 10667        3      1
    #> 10: 10686        2      0
    #> 11: 10686        2      1
    #> 12: 10686        2      1
    #> 13: 10686        2      1
    #> 14: 10686        2      1
    #> 15: 17096        5      0
    #> 16: 17096        5      0
    #> 17: 17096        5      0
    #> 18: 17096        5      0
    #> 19: 17096        5      1
    

    reprex package (v2.0.1) 于 2021 年 10 月 21 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2014-04-17
      • 2015-05-25
      • 2019-07-22
      相关资源
      最近更新 更多