我收到一份包含大量数据的工作表,要求汇总患者的血液测试数据。这是针对患者可能治愈并再次感染的感染,我的同事希望为每个患者提供一份“智能摘要”。
例如,假设我有一个这样的电子表格:
Pat ID Date Result
123 1-Feb Positive
123 1-Mar Negative
我们希望有一个摘要(可能在第二个工作表中),其中简单地说明
Pat ID Summary
123 Cured
“治愈”的标准是“曾经呈阳性,但最近一次结果呈阴性”。
其他总结项目包括“治愈但再次感染”;“当前感染”;“始终呈阴性”——希望所有这些都不言自明。我认为关键是最近的结果以及以前结果的模式与此有何关联。
我曾尝试使用数据透视表和复杂的嵌套 if 语句,但似乎无法涵盖所有内容,否则会陷入一片混乱。
我的问题是:a) 您认为不借助 VBA 可以做到这一点吗?b) 关于如何解决此问题的任何提示 - 我真的绞尽脑汁,不知道从哪里开始
答案1
是的,可以。我将您的数据以及一些其他测试样本放入名为 Tests 的表中。
然后我创建了一个结果表,其中包含一系列公式来得出每个 Pat ID 的(当前)状态:
使用表格后,我可以使用结构化引用使以下公式更易于阅读。
F2: =COUNTIFS(Tests[Pat ID],[@[Pat ID]],Tests[Result],"Positive")
G2: =COUNTIFS(Tests[Pat ID],[@[Pat ID]],Tests[Result],"Negative")
H2: =SUM(Summary[@[Pos Count]:[Neg Count]])
I2: =MAXIFS(Tests[Date],Tests[Pat ID],[@[Pat ID]])
J2: =AND(SUMPRODUCT(--(Tests[Pat ID]=[@[Pat ID]]),--(Tests[Date]=[@[Last date]]),--(Tests[Result]="Negative"))>0,[@[Pos Count]]>0)
K2: =AND(SUMPRODUCT(--(Tests[Pat ID]=[@[Pat ID]]),--(Tests[Date]=[@[Last date]]),--(Tests[Result]="Positive")),[@[Pos Count]]>0,[@[Neg Count]]>0)
L2: =[@[Pos Count]]=[@Tests]
M2: =[@[Neg Count]]=[@Tests]
N2: =IF([@Tests]>0,INDEX(Summary[[#Headers],[Cured]:[Always negative]],MATCH(TRUE,Summary[@[Cured]:[Always negative]],0)),"No data")
这些SUMPRODUCT
公式起着重要作用,值得进一步解释。
SUMPRODUCT
接受arrays
并根据条件测试它们以返回 TRUE 和 FALSE 的数组。--
在每个条件测试的开始处将 TRUE / FALSE 数组转换为 1 和 0 的数组,这些数组可以相乘,这样两个数组元素都是 1,结果就是 1。如果其中一个为 0,则1 x 0 = 0.
在 J2 中,它测试患者 ID、= MAX(Test Date)
患者 ID 的测试日期、患者 ID 的结果=MAX(Test Date)
为“阴性”且患者 ID 至少有 1 个“阳性”结果。如果没有至少 1 个“阳性”,则您无法“治愈”。
N2 被包裹在 IF 公式中,因为我意外地为 Pat 得到了错误的“Current Infection” ID = 127
。