Поскольку OP делает ссылки, агрегирующие данные по годам, но желаемые выходные данные агрегируются по годам, мы сначала агрегируем данные, включающие столбец Year
, а затем строим таблицу по годам из сводки по уровню года.
Чтобы получить фрейм данных, содержащий количество посещений врача по пациентам, годам и врачам, можно использовать dplyr::summarise()
. Обратите внимание, что я отредактировал данные так, что пациент pat_1
дважды посещал врача A
в 2000 году, поэтому сводная таблица выглядит иначе, чем исходные данные.
Patient <- c("pat_1", "pat_1", "pat_3", "pat_4", "pat_5", "pat_1", "pat_2", "pat_3", "pat_4", "pat_5", "pat_1", "pat_2", "pat_3", "pat_4", "pat_5")
Year <- c(2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2001, 2002, 2002, 2002, 2002, 2002)
Doctor <- c("A", "A", "B", "B", "C", "A", "A", "B", "C", "C", "A", "B", "C", "B", "C")
Doc.per.pat <- data.frame(Patient, Year, Doctor)
library(dplyr)
Doc.per.pat %>% group_by(Patient,Year,Doctor) %>% summarise(n = n()) ->aggData
aggData
... и вывод:
# A tibble: 14 x 4
# Groups: Patient, Year [14]
Patient Year Doctor n
<fct> <dbl> <fct> <int>
1 pat_1 2000 A 2
2 pat_1 2001 A 1
3 pat_1 2002 A 1
4 pat_2 2001 A 1
5 pat_2 2002 B 1
6 pat_3 2000 B 1
7 pat_3 2001 B 1
8 pat_3 2002 C 1
9 pat_4 2000 B 1
10 pat_4 2001 C 1
11 pat_4 2002 B 1
12 pat_5 2000 C 1
13 pat_5 2001 C 1
14 pat_5 2002 C 1
>
В этот момент данные находятся в так называемой узкой форме аккуратных данных , где одна строка представляет количество посещений для уникальной комбинации пациента, года и врача.
Решение в базе R для агрегирования, включающее Year
, использует функцию stats::aggregate()
. Сначала мы создаем вектор Count
, который мы включаем во фрейм входных данных, который суммируется в aggregate()
.
Count <- rep(1,length(Doctor))
Doc.per.pat <- data.frame(Patient, Year, Doctor,Count)
aggData <- aggregate(Count ~ Patient + Year + Doctor, data = Doc.per.pat,FUN="sum")
Вывод совпадает с результатами dplyr::summarise()
, поэтому мы не будем его здесь дублировать.
Данные могут быть дополнительно агрегированы с использованием xtabs()
или удалением столбца Year
из summarise()
. Версия xtabs()
:
xtabs(n ~ Patient + Doctor,aggData)
... и вывод:
> xtabs(n ~ Patient + Doctor,aggData)
Doctor
Patient A B C
pat_1 4 0 0
pat_2 1 1 0
pat_3 0 2 1
pat_4 0 2 1
pat_5 0 0 3
>
Можно создать вывод, подходящий для печати, расширив решение с помощью knitr::kable()
как
library(knitr)
kable(xtabs(n ~ Patient + Doctor,aggData))
... и вывод:
| | A| B| C|
|:-----|--:|--:|--:|
|pat_1 | 4| 0| 0|
|pat_2 | 1| 1| 0|
|pat_3 | 0| 2| 1|
|pat_4 | 0| 2| 1|
|pat_5 | 0| 0| 3|
>
При просмотре в браузере или редакторе HTML, который читает уценку, таблица выглядит следующим образом.