You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于R语言带条件与加权数据的疾病组合矩阵分析

计算带权重的疾病组合人群占比(含缺失值处理)

嘿,我来帮你搞定这个问题!咱们手上有带权重的疾病调查数据,还有一些NA缺失值,目标是算出每种疾病组合在人群中的占比,还要重点处理回答为(1,1)的情况对吧?下面咱们一步步来操作:

首先先把咱们的数据集明确下来,用R代码定义的话是这样:

df <- data.frame( 
  a = c(1, 1, 0, 0), 
  b = c(1, 1, 0, NA), 
  c = c(0, 1, NA, 1), 
  d = c(1, 1, 0, 1 ), 
  e = c(1, 1, 1, 0 ), 
  W = c(1.5,3.5,2.5,2.3)
)

数据预览如下:

a  b  c d e   W
1 1  1  0 1 1 1.5
2 1  1  1 1 1 3.5
3 0  0 NA 0 1 2.5
4 0 NA  1 1 0 2.3

核心问题:缺失值的处理

因为数据里有NA,这会直接影响疾病组合的计算,所以第一步得确定怎么处理这些缺失值,这里给你两种常用的方案:

方案1:删除含缺失值的样本(保守处理)

如果咱们只信任完全没有缺失的回答,那先过滤掉带NA的样本:

# 只保留疾病列没有NA的样本
df_clean <- df[complete.cases(df[, c("a","b","c","d","e")]), ]

接下来生成每个样本的疾病组合标识(把a到e的取值拼接成字符串),再用权重计算占比:

# 加载dplyr包方便数据处理(如果没装先运行install.packages("dplyr"))
library(dplyr)

# 生成组合标识
df_clean$combination <- apply(df_clean[, c("a","b","c","d","e")], 1, paste, collapse = "")

# 计算每个组合的权重总和,再算出占比
combination_proportion <- df_clean %>%
  group_by(combination) %>%
  summarise(total_weight = sum(W)) %>%
  mutate(proportion = total_weight / sum(total_weight))

print(combination_proportion)

运行后就能得到干净样本里的各组合占比——这里只有前两个样本是完整的,组合分别是11011和11111,占比分别是30%和70%。

方案2:将NA视为特定值(灵活处理)

如果不想丢弃样本,咱们可以把NA当成“未患病(0)”或者“患病(1)”来填充,这里以填充为0为例:

df_fill <- df
# 把所有疾病列的NA替换为0
df_fill[, c("a","b","c","d","e")] <- lapply(df_fill[, c("a","b","c","d","e")], function(x) ifelse(is.na(x), 0, x))

# 生成组合标识并计算占比
df_fill$combination <- apply(df_fill[, c("a","b","c","d","e")], 1, paste, collapse = "")

combination_proportion_fill <- df_fill %>%
  group_by(combination) %>%
  summarise(total_weight = sum(W)) %>%
  mutate(proportion = total_weight / sum(total_weight))

print(combination_proportion_fill)

这样处理后,第3个样本的c列NA变成0,组合是00001;第4个样本的b列NA变成0,组合是00110,咱们就能得到包含所有样本的各组合占比了。


针对“任意疾病组合回答(1,1)”的需求

如果要统计特定两两疾病都为1的组合占比(比如a和b都为1的情况),可以这么写:

# 计算a和b都为1的组合总权重占比
ab_11_proportion <- df_fill %>%
  filter(a == 1 & b == 1) %>%
  summarise(total_weight = sum(W)) %>%
  mutate(proportion = total_weight / sum(df_fill$W))

print(ab_11_proportion)

如果是要统计**所有包含至少一对(1,1)**的组合(也就是样本中至少有两种疾病为1),可以先标记每个样本是否符合条件,再计算占比:

# 标记每个样本是否有至少两个疾病为1
df_fill$has_pair_11 <- apply(df_fill[, c("a","b","c","d","e")], 1, function(x) sum(x) >= 2)

# 计算这类样本的权重占比
pair_11_proportion <- df_fill %>%
  filter(has_pair_11) %>%
  summarise(total_weight = sum(W)) %>%
  mutate(proportion = total_weight / sum(df_fill$W))

print(pair_11_proportion)

内容的提问来源于stack exchange,提问作者user9660254

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:27:43