Комплексный анализ таблиц с помощью R - PullRequest
4 голосов
/ 09 апреля 2020

У меня есть следующие данные:

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), ]))

Любое понимание того, как я могу создать эти две таблицы, будет оценено.

1 Ответ

6 голосов
/ 09 апреля 2020

Вот как я мог бы подойти к этому.

Редактировать Чтобы решить проблему, если отсутствие значения Baseline для данного Subject, как предложено OP в комментарии, используйте первый доступный LabValue (предполагается отсортированный по Visit). Кроме того, для решения проблемы нескольких LabValue на Visit для данного Subject, добавьте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...