计算加入症状的数量
Counting the number of join symptoms
我正在尝试做一些在其他语言中非常简单的事情,但在 SQL 中却令人费解。
我有一个数据库,行是患者 ID,列是 100 种症状。症状是二元的,如果患者有或没有,则为 0 或 1。假设患者 1 有 0、1、1、... 咳嗽、打喷嚏、头痛等症状。患者 2 同样具有症状 1、0、1、....
的二进制列表
我想做的只是生成一个 table,它对成对症状进行计数,即具有该症状组合的患者数量。
所以当我在新 table 中查找时,我可以看到有多少人同时打喷嚏和咳嗽。有多少人同时有头痛和打喷嚏等症状。仅成对。如果我查找打喷嚏和打喷嚏,它会给我返回打喷嚏的人数。类似于行和列中症状的矩阵格式以及内容中患有该症状的患者数量。
使用 for 循环,这在任何其他语言中都非常容易。不过,我是 SQL 的新手,正在努力寻找一种有效的方法来做到这一点。
你的问题需要编写函数并在其中使用游标。
但是,还有一个替代方法:
假设您有一个包含四列的 table:
a b c d
-------------------------
1 0 1 1
1 1 0 0
0 0 1 0
0 0 0 1
1 1 1 1
0 1 0 1
1 0 1 0
0 1 1 1
0 0 1 1
1 0 1 0
这是一个答案:
Select sum(a) as a_a,
(select count(*) from patients where a=1 and b=1 as a_b) as a_b,
(select count(*) from patients where a=1 and c=1 as a_c) as a_c,
(select count(*) from patients where a=1 and d=1 as a_d) as a_d,
sum(b) as b_b,
(select count(*) from patients where b=1 and c=1 as b_c) as b_c,
(select count(*) from patients where b=1 and d=1 as b_d) as b_d,
sum(c) as c_c,
(select count(*) from patients where c=1 and d=1 as c_d) as c_d,
sum(d) as d_d
现在,结果是这样的:
a_a a_b a_c a_d b_b b_c b_d c_c c_d d_d
-------------------------------------------------------------------------
5 2 3 2 4 2 2 7 4 6
不像矩阵;它只有一排,但它拥有您想要的一切。您可以将其扩展为您自己的 table,其中包含许多字段。
您想研究不同症状之间的相互作用,对吗?
在这种情况下,最好能得到不同症状之间的相关性,SQL不适合这个问题;您需要将 table 转换为 csv 文件,然后使用 R(甚至 excel),您可以获得相关性。
假设这是您的 CSV 文件 (C:/dataFile.csv):
a, b, c, d, e, f
----------------
1, 1, 1, 0, 1, 0
1, 1, 0, 1, 1, 1
0, 0, 0, 1, 0, 0
0, 1, 1, 0, 1, 0
1, 0, 0, 0, 1, 0
0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0
1, 1, 0, 1, 1, 1
现在,在 R Statistics 中,您可以 运行 以下命令一一执行:
> data <- read.csv("C:/dataFile.csv")
> summary(data)
> cor(data)
这是结果:
a b c d e f
a 1.0000000 0.5000000 0.0000000 0.25819889 0.77459667 0.5773503
b 0.5000000 1.0000000 0.5773503 0.25819889 0.77459667 0.5773503
c 0.0000000 0.5773503 1.0000000 -0.44721360 0.44721360 -0.3333333
d 0.2581989 0.2581989 -0.4472136 1.00000000 0.06666667 0.7453560
e 0.7745967 0.7745967 0.4472136 0.06666667 1.00000000 0.4472136
f 0.5773503 0.5773503 -0.3333333 0.74535599 0.44721360 1.0000000
两个具有较高相关性的症状意味着这两个症状大部分是一起变化的。例如,[a 和 e] 或 [b 和 e] 高度相关。
我希望能让您对如何处理数据分析有更广泛的了解。
@GarethD 的回答帮助解决了问题:谢谢!
关键是要对数据进行逆透视,这样每个患者的每个症状都有一行,然后将这些数据与其自身结合以获得成对的症状,然后将结合的数据回溯以获得你的计数。因为我不知道要使用哪个 DBMS,所以我无法回答这个问题,但是我创建了一个 working demo in SQL Server 来演示如何做。 – GarethD 昨天
我正在尝试做一些在其他语言中非常简单的事情,但在 SQL 中却令人费解。
我有一个数据库,行是患者 ID,列是 100 种症状。症状是二元的,如果患者有或没有,则为 0 或 1。假设患者 1 有 0、1、1、... 咳嗽、打喷嚏、头痛等症状。患者 2 同样具有症状 1、0、1、....
的二进制列表我想做的只是生成一个 table,它对成对症状进行计数,即具有该症状组合的患者数量。
所以当我在新 table 中查找时,我可以看到有多少人同时打喷嚏和咳嗽。有多少人同时有头痛和打喷嚏等症状。仅成对。如果我查找打喷嚏和打喷嚏,它会给我返回打喷嚏的人数。类似于行和列中症状的矩阵格式以及内容中患有该症状的患者数量。
使用 for 循环,这在任何其他语言中都非常容易。不过,我是 SQL 的新手,正在努力寻找一种有效的方法来做到这一点。
你的问题需要编写函数并在其中使用游标。
但是,还有一个替代方法:
假设您有一个包含四列的 table:
a b c d
-------------------------
1 0 1 1
1 1 0 0
0 0 1 0
0 0 0 1
1 1 1 1
0 1 0 1
1 0 1 0
0 1 1 1
0 0 1 1
1 0 1 0
这是一个答案:
Select sum(a) as a_a,
(select count(*) from patients where a=1 and b=1 as a_b) as a_b,
(select count(*) from patients where a=1 and c=1 as a_c) as a_c,
(select count(*) from patients where a=1 and d=1 as a_d) as a_d,
sum(b) as b_b,
(select count(*) from patients where b=1 and c=1 as b_c) as b_c,
(select count(*) from patients where b=1 and d=1 as b_d) as b_d,
sum(c) as c_c,
(select count(*) from patients where c=1 and d=1 as c_d) as c_d,
sum(d) as d_d
现在,结果是这样的:
a_a a_b a_c a_d b_b b_c b_d c_c c_d d_d
-------------------------------------------------------------------------
5 2 3 2 4 2 2 7 4 6
不像矩阵;它只有一排,但它拥有您想要的一切。您可以将其扩展为您自己的 table,其中包含许多字段。
您想研究不同症状之间的相互作用,对吗?
在这种情况下,最好能得到不同症状之间的相关性,SQL不适合这个问题;您需要将 table 转换为 csv 文件,然后使用 R(甚至 excel),您可以获得相关性。
假设这是您的 CSV 文件 (C:/dataFile.csv):
a, b, c, d, e, f
----------------
1, 1, 1, 0, 1, 0
1, 1, 0, 1, 1, 1
0, 0, 0, 1, 0, 0
0, 1, 1, 0, 1, 0
1, 0, 0, 0, 1, 0
0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0
1, 1, 0, 1, 1, 1
现在,在 R Statistics 中,您可以 运行 以下命令一一执行:
> data <- read.csv("C:/dataFile.csv")
> summary(data)
> cor(data)
这是结果:
a b c d e f
a 1.0000000 0.5000000 0.0000000 0.25819889 0.77459667 0.5773503
b 0.5000000 1.0000000 0.5773503 0.25819889 0.77459667 0.5773503
c 0.0000000 0.5773503 1.0000000 -0.44721360 0.44721360 -0.3333333
d 0.2581989 0.2581989 -0.4472136 1.00000000 0.06666667 0.7453560
e 0.7745967 0.7745967 0.4472136 0.06666667 1.00000000 0.4472136
f 0.5773503 0.5773503 -0.3333333 0.74535599 0.44721360 1.0000000
两个具有较高相关性的症状意味着这两个症状大部分是一起变化的。例如,[a 和 e] 或 [b 和 e] 高度相关。
我希望能让您对如何处理数据分析有更广泛的了解。
@GarethD 的回答帮助解决了问题:谢谢!
关键是要对数据进行逆透视,这样每个患者的每个症状都有一行,然后将这些数据与其自身结合以获得成对的症状,然后将结合的数据回溯以获得你的计数。因为我不知道要使用哪个 DBMS,所以我无法回答这个问题,但是我创建了一个 working demo in SQL Server 来演示如何做。 – GarethD 昨天