library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
#Caso ficticio
#Genera una lista de medicamentos al azar para la demostración
lista=sample(1:2000,200)
npac=1000 #número de pacientes
ncol=3 #número de columnas de medicamentos
#Genera listado de medicamentos asignados a los pacientes
M1=sample(1:2000,npac)
M2=sample(1:2000,npac)
M3=sample(1:2000,npac)
M4=sample(1:2000,npac)
#con fines de la demostración se asignan los medicamentos con #cierta probabilidad de tal forma que los pacientes no tomen #todos los medicamentos
M1=M1*(rnorm(npac,0,1)>0.4)
M2=M2*(rnorm(npac,0,1)>0.4)
M3=M3*(rnorm(npac,0,1)>0.4)
M4=M4*(rnorm(npac,0,1)>0.4)
#Solo tomaremos ncol=3 para las casillas de los medicamentos
#Creamos una dataframe con estos datos, la primera columna sería
#el ID del paciente
pacientes=data.frame(paciente=1:npac,M1=M1,M2=M2,M3=M3)
head(pacientes)
## paciente M1 M2 M3
## 1 1 688 0 0
## 2 2 0 928 441
## 3 3 0 0 1082
## 4 4 0 0 0
## 5 5 0 0 0
## 6 6 1537 0 0
tail(pacientes)
## paciente M1 M2 M3
## 995 995 93 1742 1310
## 996 996 0 0 678
## 997 997 814 223 594
## 998 998 598 0 1199
## 999 999 0 0 558
## 1000 1000 186 0 1135
Si ya tienes la dataframe debes iniciar en este punto
#obtenemos la columna de ID del paciente y la replicamos ncol #veces para luego pasar la dataframe al formato largo
p=pacientes[,1]
p=rep(p,ncol)
Pasamos nuestra dataframe a un formato largo para trabajarla con la librería
df=stack(pacientes[,2:4])
df$pac=p
names(df)=c("medicamento","Col","paciente")
df$paciente=factor(df$paciente)
head(df,20)
## medicamento Col paciente
## 1 688 M1 1
## 2 0 M1 2
## 3 0 M1 3
## 4 0 M1 4
## 5 0 M1 5
## 6 1537 M1 6
## 7 0 M1 7
## 8 0 M1 8
## 9 1129 M1 9
## 10 0 M1 10
## 11 0 M1 11
## 12 795 M1 12
## 13 0 M1 13
## 14 0 M1 14
## 15 1538 M1 15
## 16 0 M1 16
## 17 1002 M1 17
## 18 0 M1 18
## 19 0 M1 19
## 20 758 M1 20
df2<-df %>% group_by(paciente) %>% summarize(a=intersect(medicamento,lista)) %>% group_by(paciente) %>% count()
## `summarise()` has grouped output by 'paciente'. You can override using the `.groups` argument.
head(df2,20)
## # A tibble: 20 x 2
## # Groups: paciente [20]
## paciente n
## <fct> <int>
## 1 6 1
## 2 25 1
## 3 27 1
## 4 37 1
## 5 40 1
## 6 44 1
## 7 49 1
## 8 53 1
## 9 58 1
## 10 71 1
## 11 79 1
## 12 86 1
## 13 127 1
## 14 152 1
## 15 153 1
## 16 161 1
## 17 168 1
## 18 169 1
## 19 177 1
## 20 200 1
tail(df2,20)
## # A tibble: 20 x 2
## # Groups: paciente [20]
## paciente n
## <fct> <int>
## 1 779 1
## 2 795 1
## 3 804 1
## 4 817 1
## 5 820 1
## 6 834 1
## 7 837 1
## 8 840 1
## 9 849 1
## 10 862 1
## 11 872 1
## 12 889 1
## 13 899 1
## 14 902 1
## 15 918 1
## 16 964 1
## 17 991 1
## 18 995 1
## 19 997 1
## 20 998 1