Вот как я мог бы подойти к этому.
Редактировать Чтобы решить проблему, если отсутствие значения 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