首页 > 解决方案 > 使用 R 根据不同的分配矩阵分配个人

问题描述

几个计算步骤产生了如下所示的数据框

FACILITY.ID         LOC0001 LOC0002 LOC0010 LOC0043 LOC0054 LOC0065 LOC0100
       FAC002       1       0       0       1       0       0       0
       FAC003       1       2       0       0       0       0       0
       FAC004       0       0       1       0       0       0       0
       FAC005       0       2       0       0       0       0       0
       FAC006       0       0       0       0       2       0       0
       FAC007       0       0       0       0       0       0       0

位置和设施分别是列名和行名。

我有另一个数据框,如下所示

PATIENT.ID   LOCATION.ID
 P001          LOC0002
 P002          LOC0001
 P003          LOC0043
 P004          LOC0001

现在,数据集中的患者人数和矩阵的总数相同。

我需要制作数据集

PATIENT.ID   FACILITY.ID
 P001          FAC0003
 P002          FAC0002
 P003          FAC0002
 P004          FAC0003

基本上,一旦来自某个位置的患者获得设施,来自同一位置的患者就会根据矩阵前往另一个设施。根本做不到

标签: r

解决方案


使用的选项data.table

#create an ID (LOC.NUM) for each empty LOC at each FACILITY
mDT <- melt(capacity, id.vars="FACILITY.ID", variable.name="LOCATION.ID")[
    value > 0L, .(FACILITY.ID=rep(FACILITY.ID, value), LOC.NUM=seq_len(sum(value))), LOCATION.ID]

#perform update join to look up LOCATION for each PATIENT
patients[, LOC.NUM := rowid(LOCATION.ID)][
    mDT, on=.(LOCATION.ID, LOC.NUM), FAC.ID := FACILITY.ID]

输出:

   PATIENT.ID LOCATION.ID LOC.NUM FAC.ID
1:       P001     LOC0002       1 FAC003
2:       P002     LOC0001       1 FAC002
3:       P003     LOC0043       1 FAC002
4:       P004     LOC0001       2 FAC003

数据:

library(data.table)
capacity <- fread("FACILITY.ID         LOC0001 LOC0002 LOC0010 LOC0043 LOC0054 LOC0065 LOC0100
FAC002       1       0       0       1       0       0       0
FAC003       1       2       0       0       0       0       0
FAC004       0       0       1       0       0       0       0
FAC005       0       2       0       0       0       0       0
FAC006       0       0       0       0       2       0       0
FAC007       0       0       0       0       0       0       0")

patients <- fread("PATIENT.ID   LOCATION.ID
P001          LOC0002
P002          LOC0001
P003          LOC0043
P004          LOC0001")

推荐阅读