几个计算步骤产生了一个数据框,如下所示
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
基本上,一旦来自某个位置的患者获得设施,来自同一位置的患者就会按照矩阵前往另一个设施。根本做不到
使用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")