基于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
相关产品推荐
相关产品推荐

