【问题标题】:Dropping subsequent observations after the occurrence of an event in a longitudinal data set在纵向数据集中发生事件后丢弃后续观察
【发布时间】:2021-03-12 17:23:46
【问题描述】:

我得到了纵向数据集,我想在感兴趣的事件发生后删除观察结果。这意味着我想在指示感兴趣的event 的虚拟变量发生后删除所有观察结果(即event == 1)。数据看起来像这样:

id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
time <-  c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3) 
event <- c(0,1,0,1,0,0,0,0,0,0,1,0,1,0,0)

df <- cbind(id,time,event)

      id time event
 [1,]  1    1     0
 [2,]  1    2     1
 [3,]  1    3     0
 [4,]  2    1     1
 [5,]  2    2     0
 [6,]  2    3     0
 [7,]  3    1     0
 [8,]  3    2     0
 [9,]  3    3     0
[10,]  4    1     0
[11,]  4    2     1
[12,]  4    3     0
[13,]  5    1     1
[14,]  5    2     0
[15,]  5    3     0

我想在事件发生后放弃所有后续观察(为清楚起见:event == 1)为id。导致如下所示的数据集:

     id time event
[1,]  1    1     0
[2,]  1    2     1
[3,]  2    1     1
[4,]  3    1     0
[5,]  3    2     0
[6,]  3    3     0
[7,]  4    1     0
[8,]  4    2     1
[9,]  5    1     1

我最大的问题是如何以时间变量为条件去除后续观察。

提前致谢! :D

【问题讨论】:

    标签: r longitudinal


    【解决方案1】:

    如果数据被构造为data.frame,那么我们可以在dplyr中使用group by操作,即按'id'分组,如果有的话,得到第一次出现1的位置索引和获取序列,否则返回行序列

    library(dplyr)
    df %>%
      arrange(id, time) %>%
      group_by(id) %>%
      slice(if(1 %in% event) seq(match(1, event)) else row_number()) %>%
      ungroup
    

    -输出

    # A tibble: 9 x 3
    #     id  time event
    #  <dbl> <dbl> <dbl>
    #1     1     1     0
    #2     1     2     1
    #3     2     1     1
    #4     3     1     0
    #5     3     2     0
    #6     3     3     0
    #7     4     1     0
    #8     4     2     1
    #9     5     1     1
    

    如果我们将nomatch 指定为行数(n()),则可以在不使用if/else 的情况下使其更短

    df %>%
        arrange(id, time) %>%
        group_by(id) %>%
        slice(seq(match(1, event, nomatch = n())))
    

    数据

    df <- data.frame(id, time, event)
    

    【讨论】:

    • 谢谢!只是为了澄清:这个解决方案只有在数据框按时订购时才有效?对吗?
    • @ecl 是的,我假设它已经订购了,否则,您可以在group_by 之前使用arrange(id, time) %&gt;%
    • 谢谢!谢谢你帮助我!
    【解决方案2】:

    seq_len()的解决方案

    library(dplyr)
    df %>%
    arrange(id, time)  %>%
      group_by(id) %>%
      slice(seq_len(min(which(event == 1), n())))
    

    数据

    id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
    time <-  c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3) 
    event <- c(0,1,0,1,0,0,0,0,0,0,1,0,1,0,0)
    
    df <- data.frame(id,time,event)
    
    # output:
    # Groups:   id [5]
         id  time event
      <dbl> <dbl> <dbl>
    1     1     1     0
    2     1     2     1
    3     2     1     1
    4     3     1     0
    5     3     2     0
    6     3     3     0
    7     4     1     0
    8     4     2     1
    9     5     1     1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2020-04-08
      相关资源
      最近更新 更多