我正在尝试根据 ICD-10 标准和 MDI(重度抑郁量表)的数据提出抑郁症严重程度的 R 代码。该问卷由 12 个问题组成(mdi_1、mdi_2、mdi_3、 mdi_4、mdi_5、mdi_6、mdi_7、mdi_8a、mdi_8b、mdi_9、mdi_10a、mdi_10b)。前三个问题描述了主要标准(粗体),其余问题描述了次要标准。对于问题 8 (a,b) 和 10 (a,b),仅计算较高的值。
ICD-10 轻度抑郁症标准规定,至少 2 个主要标准(即问题 1-3)必须评分至少 4 分,其余 7 项中的 2 或 3 项必须评分至少 3 分。
我目前正在尝试通过映射每个可能的条件来用
dplyr
、mutate
、case_when
来实现这一点,但我想知道是否有更简洁的方法。
其他抑郁症严重程度类别的工作原理类似,因此通过针对“轻度抑郁症”的简洁解决方案,我可以将其适应其余类别。
谢谢您的帮助!
df |>
mutate(mdi_cat =
case_when(
# Check if at least 2 out of the first 3 questions have a score of at least 4
(mdi_1 >= 4 & mdi_2 >= 4) | (mdi_1 >= 4 & mdi_3 >= 4) | (mdi_2 >= 4 & mdi_3 >= 4) &
# Check if 2 or 3 of the remaining 7 questions have a score of at least 3
((mdi_4 >= 3 & mdi_5 >= 3) | (mdi_4 >= 3 & mdi_6 >= 3) | (mdi_4 >= 3 & mdi_7 >= 3) | ...
(mdi_4 >= 3 & mdi_5 >= 3 & mdi_6 >= 3) | (mdi_4 >= 3 & mdi_5 >= 3 & mdi_7 >= 3) | ...
) ~ "mild",
TRUE ~ "no"
))```
您可以使用
across()
和 rowSums()
来确定满足最低分数或分数条件的问题数量,而不是检查每个可能的条件。然后您可以轻松检查个人是否满足这两个条件。第一步,我使用 pmax
将 a/b 问题折叠到一个包含最高分数的新列中。
使用一些虚假的随机示例数据:
set.seed(123)
n <- 10
max_pt <- 6
df <- data.frame(
mdi_1 = sample(max_pt, n, replace = TRUE),
mdi_2 = sample(max_pt, n, replace = TRUE),
mdi_3 = sample(max_pt, n, replace = TRUE),
mdi_4 = sample(max_pt, n, replace = TRUE),
mdi_5 = sample(max_pt, n, replace = TRUE),
mdi_8a = sample(max_pt, n, replace = TRUE),
mdi_8b = sample(max_pt, n, replace = TRUE),
mdi_10a = sample(max_pt, n, replace = TRUE),
mdi_10b = sample(max_pt, n, replace = TRUE)
)
library(dplyr, warn=FALSE)
df |>
mutate(
mdi_8 = pmax(mdi_8a, mdi_8b),
mdi_10 = pmax(mdi_10a, mdi_10b)
) |>
mutate(
# Number of first three questions with at least 4 points
n_mdi_cat1 = rowSums(across(any_of(paste0("mdi_", 1:3)), ~ .x >= 4)),
# Number of other questions with at least 3 points
n_mdi_cat2 = rowSums(across(any_of(paste0("mdi_", 4:10)), ~ .x >= 3)),
mdi_cat = case_when(
n_mdi_cat1 >= 2 & n_mdi_cat2 >= 2 ~ "mild",
.default = "no"
)
)
#> mdi_1 mdi_2 mdi_3 mdi_4 mdi_5 mdi_8a mdi_8b mdi_10a mdi_10b mdi_8 mdi_10
#> 1 3 6 1 1 4 5 4 1 1 5 1
#> 2 6 1 5 3 5 2 4 2 6 4 6
#> 3 3 2 3 5 5 1 6 4 1 6 4
#> 4 2 3 2 4 3 1 6 5 3 6 5
#> 5 2 5 2 2 6 3 3 5 6 3 6
#> 6 6 3 1 5 1 1 6 6 4 6 6
#> 7 3 3 6 1 2 6 6 3 1 6 3
#> 8 5 1 3 1 5 5 1 1 6 5 6
#> 9 4 4 4 2 5 1 6 4 6 6 6
#> 10 6 1 6 3 4 2 2 6 3 2 6
#> n_mdi_cat1 n_mdi_cat2 mdi_cat
#> 1 1 2 no
#> 2 2 4 mild
#> 3 0 4 no
#> 4 0 4 no
#> 5 1 3 no
#> 6 1 3 no
#> 7 1 2 no
#> 8 1 3 no
#> 9 3 3 mild
#> 10 2 3 mild