代码之家  ›  专栏  ›  技术社区  ›  Casey

合并数据以创建R中的纵向数据帧

  •  0
  • Casey  · 技术社区  · 1 年前

    我有数据帧df_master,它由多个患者的纵向数据(“record_id”)组成,其中每行代表一天的随访(“时间”)。

    第二个数据帧具有患者复发的复发时间点。在这个玩具示例中,患者A在时间=2时复发一次,患者B在时间=1和时间=3时复发,并且患者C从未复发。

    玩具数据:

    library(tidyverse)
    
    record_id <- c("A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "C")
    time <- c(1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5)
    
    df_master <- tibble(record_id, time)
    
    record_id <- c("A", "B", "B")
    day_relapse <- c(2, 1, 3)
    
    df_relapses <- tibble(record_id, day_relapse)
    

    我们的两个数据帧如下所示:

    > print(df_master)
    
    # A tibble: 12 × 2
       record_id  time
       <chr>     <dbl>
     1 A             1
     2 A             2
     3 A             3
     4 B             1
     5 B             2
     6 B             3
     7 B             4
     8 C             1
     9 C             2
    10 C             3
    11 C             4
    12 C             5
    
    > print(df_relapses)
    # A tibble: 3 × 2
      record_id day_relapse
      <chr>           <dbl>
    1 A                   2
    2 B                   1
    3 B                   3
    

    我想创建一个合并的数据帧,其中包括df_master的所有数据,其中变量day_relapse被添加到新的数据帧df_merged中,其中day_relapage的值为NA,除了给定record_id的时间==day_relape时,在这种情况下,day_relapise将等于时间值。合并后的数据帧应如下所示:

    # A tibble: 12 × 3
       record_id  time day_relapse
       <chr>     <dbl>       <dbl>
     1 A             1          NA
     2 A             2           2
     3 A             3          NA
     4 B             1           1
     5 B             2          NA
     6 B             3           3
     7 B             4          NA
     8 C             1          NA
     9 C             2          NA
    10 C             3          NA
    11 C             4          NA
    12 C             5          NA
    

    如何生成合并后的数据帧?对于我正在创建的一种类型的游泳图,合并后的df的奇怪格式是必需的。提前谢谢。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Jon Spring    1 年前

    我们可以用相同的名称复制day_relapse列( time )作为我们要加入的另一张桌子。然后我们会得到 day_relapse 当它在第二张表中可用时,不可用时为NA。

    df_master |>
      left_join(df_relapses |> mutate(time = day_relapse))
    

    后果

    Joining with `by = join_by(record_id, time)`
    # A tibble: 12 × 3
       record_id  time day_relapse
       <chr>     <dbl>       <dbl>
     1 A             1          NA
     2 A             2           2
     3 A             3          NA
     4 B             1           1
     5 B             2          NA
     6 B             3           3
     7 B             4          NA
     8 C             1          NA
     9 C             2          NA
    10 C             3          NA
    11 C             4          NA
    12 C             5          NA
    
    推荐文章