【问题标题】:Complex table analysis with R使用 R 进行复杂表分析
【发布时间】:2020-07-21 14:24:53
【问题描述】:

我有以下数据:

Group           Subject           Lab               LabValue          Visit         Baseline    Count
1               001               Lab1              10                Day 1         Y           1
1               001               Lab1              11                Day 2                     2
1               001               Lab1              12                Day 30                    3
1               002               Lab1              11                Day 1         Y           1
1               002               Lab1              12                Day 30                    2
2               005               Lab1               9                Day 1         Y           1
2               005               Lab1              16                Day 2                     2
2               005               Lab1              11                Month 1                   3
2               006               Lab1              18                Day 1         Y           1
2               006               Lab1              10                Day 2                     2

我想创建两个表:

第一个表格显示 Lab1 的基线值变化,计算访问时的平均值,并使用该特定访问的新患者子集重新计算基线:

   Visit        NumberSubjects     VisitMean     BaselineMean    MeanChangeFromBaseline
   Baseline     4                  12            12              .
   Day 2        3                  12.3          13              -0.67
   Day 30       2                  12            10.5            +1.5
   Month 1      1                  11            9               +2

第二个表允许选择将第 1 个月没有访问的所有受试者的最后访问“推送”到第 1 个月的行(即受试者 001、002 和 005):

   Visit        NumberSubjects     VisitMean     BaselineMean    MeanChangeFromBaseline
   Baseline     4                  12            12              .
   Month 1      4                  11.25         12              -0.75

(对于科目 001 和 002,第 30 天的值成为第 1 个月的值;对于科目 006,第 2 天的值成为第 1 个月的值)。

这很复杂,但我想看看是否有使用 dplyr 的方法。

我相信我可以使用以下代码为每个主题选择最后一个值:

do.call("rbind", 
        by(df, INDICES=df$Subject, FUN=function(DF) DF[which.max(DF$count), ]))

任何关于我如何创建这两个表的见解将不胜感激。

【问题讨论】:

    标签: r datatable dplyr


    【解决方案1】:

    这是我可能的处理方法。

    编辑要解决给定Subject 缺少Baseline 值的问题,如OP 在评论中建议的那样,请使用第一个可用的LabValue(假设按Visit 排序)。此外,要解决给定Subject 的每个Visit 多个LabValue 的问题,请添加group_by(Visit, Subject)slice(1) 以使用第一个可用值。代码已更新,输出应与原始示例相同。

    对于表1,您可以group_by(Subject),然后在每个主题的基线处添加LabValue 的附加列。这将使通过访问计算统计数据变得更加容易。

    library(tidyverse)
    
    # Table 1
    df %>%
      group_by(Subject) %>%
      mutate(Baseline = first(LabValue)) %>%
      group_by(Visit, Subject) %>% 
      slice(1) %>%
      group_by(Visit) %>%
      summarise(NumberSubjects = n(),
                VisitMean = mean(LabValue),
                BaselineMean = mean(Baseline),
                MeanChangeFromBaseline = VisitMean - BaselineMean)
    

    输出

    # A tibble: 4 x 5
      Visit   NumberSubjects VisitMean BaselineMean MeanChangeFromBaseline
      <chr>            <int>     <dbl>        <dbl>                  <dbl>
    1 Day_1                4   12           12                         0  
    2 Day_2                3   12.3333      12.3333                    0  
    3 Day_30               2   12           10.5                       1.5
    4 Month_1              1   11            9                         2 
    

    对于表 2,我建议使用 complete 之类的内容添加未针对每个主题进行的数据收集访问的空行,然后使用 fill 执行“最后一次观察结果”向前”。然后最新可用的LabValue 将结转到第 1 个月。

    # Table 2
    df %>%
      group_by(Subject) %>%
      mutate(Baseline = first(LabValue)) %>%
      ungroup() %>%
      complete(Subject, Visit) %>%
      group_by(Subject) %>%
      fill(LabValue, Baseline, .direction = "down") %>%
      filter(Visit == "Day_1" | Visit == "Month_1") %>%
      group_by(Visit, Subject) %>% 
      slice(1) %>%
      group_by(Visit) %>%
      summarise(NumberSubjects =sum(!is.na(LabValue)),
                VisitMean = mean(LabValue, na.rm = TRUE),
                BaselineMean = mean(Baseline, na.rm = TRUE),
                MeanChangeFromBaseline = VisitMean - BaselineMean)
    

    输出

    # A tibble: 2 x 5
      Visit   NumberSubjects VisitMean BaselineMean MeanChangeFromBaseline
      <chr>            <int>     <dbl>        <dbl>                  <dbl>
    1 Day_1                4     12              12                   0   
    2 Month_1              4     11.25           12                  -0.75
    

    【讨论】:

    • 以下代码行不起作用:mutate(Baseline = LabValue[Baseline == "Y"])。我收到以下错误:错误:列 Baseline 的长度必须为 10(组大小)或 1,而不是 0。是否有更明确的方式来编写此代码?看起来我们正在将 Baseline 设置为具有基线标志的 LabValues 的子集。
    • 是的,受试者每次访问可能有一个或多个价值以及缺少基线。
    • 我只能使用虚拟数据。根据处理期望的结果,我们可以完全省略没有基线实验室值的受试者;此外,我们可以只在特定访问中使用 labvalue 的第一个实例。
    • 谢谢!我还尝试使用以下代码在每次访问时获取第一个 LabValue: group_by(Subject) %>% mutate( first = dplyr::first(na.omit(LabValue))
    • 看起来基线的受试者数量计算不正确。当我运行你的代码时,我比实际数字少 20;然后,第 1 个月的受试者数量会增加到超过基线访问的受试者总数。我用基本的 R 代码验证了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2013-03-23
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多