В R есть способ узнать, сколько раз элемент в одном столбце соответствует указанному c элементу в другом? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть таблица, которая показывает визиты пациентов в больницу. Можно видеть, какого врача они посещают каждый раз, например:

Patient <- c("pat_1", " pat_2", " 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)

В таблице около 150 тысяч строк, где каждый пациент может появляться несколько раз (часто чаще, чем один раз в год). Я хотел бы узнать, сколько раз каждый пациент посещает каждого врача, как в следующей таблице:

Doc.per.patient.outcome <- matrix(c(3,0,0 ,2,1,0 ,0,2,1 ,0,2,1 ,0,0,3), ncol=3, byrow = TRUE)
rownames(Doc.per.patient.outcome) <- gl(5, 1, labels = c(paste("pat", 1:5, sep = "_")))
colnames(Doc.per.patient.outcome) <- c("A", "B", "C")
Doc.per.patient.outcome <- as.table(Doc.per.patient.outcome)
Doc.per.patient.outcome

Я полностью застрял. Подумал о dplyr и "выберите" пациента и год. Затем «считать» или «таблица» для каждого пациента. Тогда я бы назначил докторов каждому пациенту. Но проблема в том, как это можно преобразовать в таблицу или фрейм данных. Буду очень благодарен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Поскольку 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, который читает уценку, таблица выглядит следующим образом.

enter image description here

0 голосов
/ 22 февраля 2020
as.data.frame(table(Patient = Doc.per.pat$Patient, Doctor = Doc.per.pat$Doctor))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...