Ganeración de una base de datos ficticia

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

Listado de pacientes con la cantidad de medicamentos que toman de la lista de 200

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