如何用R语言基于多疾病列与多特征列生成列联表?
多疾病列生成列联表的R实现方案
针对你有多个疾病列(disease1、disease2)的场景,可以通过调整tidyr和dplyr的操作逻辑,生成和单疾病场景格式一致的列联表,具体代码和步骤如下:
完整代码
library(dplyr) library(tidyr) # 你的数据集 disease1 <- c("high", "low", "high", "high", "low","low","low","low"); disease2 <- c("high", "high", "high", "high", "low","low","low","low"); ToA <- c("P","A","P","P","A","A","A","P"); ToB <- c("P","A","A","P","A","P","A","P"); ToC <- c("P","P","A","P","A","A","A","P"); df <- data.frame(disease1, disease2, ToA, ToB, ToC) # 生成多疾病列联表 result <- df %>% # 将所有疾病列转成长格式,区分不同疾病类型 pivot_longer(starts_with("disease"), names_to = "disease_type", values_to = "disease_val") %>% # 将所有检测列(ToA/ToB/ToC)转成长格式 pivot_longer(starts_with("To"), names_to = "test_item", values_to = "test_val") %>% # 统计每个组合的频数 count(disease_type, test_item, disease_val, test_val) %>% # 转成宽格式,保持和单疾病场景一致的命名规则 pivot_wider( names_from = c(disease_val, test_val), values_from = n, names_sep = "_", values_fill = 0 # 可选:填充缺失的频数为0,让结果更规整 ) print(result)
代码逻辑说明
- 第一步:用
starts_with("disease")匹配所有疾病列,转成长格式后新增disease_type标记疾病列名称、disease_val存储high/low取值。 - 第二步:用
starts_with("To")匹配所有检测列,转成长格式后新增test_item标记检测项名称、test_val存储P/A取值。 - 第三步:通过
count()统计每个疾病类型-检测项-疾病取值-检测取值组合的出现次数。 - 第四步:转成宽格式,将
disease_val和test_val拼接为列名(用_分隔),频数作为对应列的值。
输出示例
运行后会得到类似如下的结果,每一行对应一个检测项,列则包含不同疾病的high/low与检测P/A组合的频数:
# A tibble: 6 × 5 disease_type test_item high_P high_A low_P low_A <chr> <chr> <int> <int> <int> <int> 1 disease1 ToA 3 1 1 3 2 disease1 ToB 2 2 2 2 3 disease1 ToC 3 1 1 3 4 disease2 ToA 3 1 1 3 5 disease2 ToB 3 1 1 3 6 disease2 ToC 3 1 1 3
内容的提问来源于stack exchange,提问作者md hossain
相关产品推荐
相关产品推荐

