如何将含重复血管计数的独热编码tibble转为正确的tbl_summary表格
如何用gtsummary正确统计独热编码血管数据的病例数及占比
我有一个独热编码的tibble,用于记录特定肿瘤中各类动脉的出现情况,数据分为primary(原发)和secondary(继发)两组。部分血管因存在左右侧同名情况,单个肿瘤中该血管可出现2次。
简化问题的测试代码如下:
test <- tibble( group = c("primary", "secondary", "secondary", "primary"), common_carotid = as.numeric(c(1, 2, 0, 0)), internal_carotid = as.numeric(c(0, 1, 0, 1)) ) test |> tbl_summary( by = group, missing = "no" ) %>% add_p() %>% modify_header(label ~ "**Vessel**")
当前生成的表格将数值当作因子展示,出现多行记录。我希望生成每个血管仅占一行的tbl_summary表格,正确统计出现病例数及占比,期望输出如下:
| Vessel | Primary, N=2 | Secondary N=3 | p-value | | Common_carotid | 1 (50%) | 2 (67%) | >0.9 | | internal_carotid | 1 (50%) | 1 (33%) | >0.9 |
手动将common_carotid中的2改为1可得到该表格,但gtsummary似乎误将数值变量当作因子处理,即使已转换为数值类型。以下是原始数据片段:
dput(head(data, 20)) structure(list(ID = c(23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 54, 55, 56, 57, 58, 59, 60), genesis_group = c("Secondary", "Secondary", "Secondary", "Secondary", "Secondary", "Primary", "Secondary", "Secondary", "Secondary", "Secondary", "Primary", "Secondary", "Secondary", "Primary", "Secondary", "Secondary", "Primary", "Primary", "Primary", "Primary"), Arteries = structure(c(21L, 96L, 39L, 79L, 96L, 32L, 59L, 79L, NA, 85L, 48L, 59L, 48L, 100L, 100L, 100L, 100L, 100L, 101L, 101L), levels = c("APA", "ASCA", "ASCA RA", "BCA", "DCA", "DCA RA", "DTA STA OA", "LAPA LOA", "LAPA RAPA RA", "LBCA", "LCCA", "LCCA LICA", "LCCA LICA LVA", "LDCA LOA", "LDCA LVA LASCA", "LDTA", "LECA", "LECA LSTA LEA REA LMMA", "LFA", "LIAA LSMA", "LICA", "LICA LMA", "LICA RECA", "LMA", "LMA LOA LSTA", "LMA LOPA DNA", "LOA", "LOA LAPA LDCA", "LOA LPAA LSTA", "LOA LSTA LEA", "LOA ROA LSTA RSTA", "LOPA", "LOPA LSTA", "LRA", "LSA", "LSA CCA", "LSOA RSOA RSTA LSTA", "LSPA", "LSTA", "LSTA LDTA", "LSTA LMA LMMA", "LSTA LOA", "LSTA LSTRA", "LSTA RSTA LSOA LPAA", "LSTA RSTA ROPA LOPA", "LSTHA", "LTT", "LVA", "LVA ECA", "LVA LECA", "MA", "OA", "OA PAA", "OA TT", "OPA", "PA", "RA", "RBCA", "RCCA", "RCCA RVA", "REA", "RECA", "RECA PAA", "RECA RFA", "RECA RSA RCCT RTT", "RFA", "RFA RMA", "RICA", "RICA RECA", "RITT", "RLA", "RMA", "ROA", "ROA RPAA", "ROA RSTA", "ROA RVA", "ROPA", "ROPA RMA", "RSA", "RSA TT", "RSCA", "RSOA", "RSOA RSTA", "RSPA", "RSTA", "RSTA LOA ROA", "RSTA LSTA", "RSTA RFA", "RSTA RMA RPAA", "RSTA ROA", "RSTA RPAA", "RSTHA", "RSUBLA ANGA", "RTA", "RTT", "RVA", "RVA ROA", "RVA RTT", "SLA", "STA", "STA OA", "STA OA OPA STA", "STA OPA", "STA PAA", "STA SOA", "TT", "VA", "VA APA DCA"), class = "factor"), Veins = c("LIJV", "RIJV", NA, "RIJV", "RVV", "LIOV", "REJV", "RSV", NA, NA, "LVV", "LIJV", "LIJV", NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))
解决方法
问题核心是gtsummary默认对数值变量展示全部分布,但我们需要统计的是病例中该血管是否出现(数值>0即判定为存在),而非具体数值分布。可通过以下两种方式处理:
1. 预处理数据:转换为二分类变量
将每个血管的数值转换为二分类因子,标记该病例是否出现目标血管:
test_processed <- test %>% mutate( across(c(common_carotid, internal_carotid), ~ as.factor(ifelse(.x > 0, "Present", "Absent"))) ) test_processed |> tbl_summary( by = group, missing = "no", type = all_categorical() ~ "categorical" ) %>% add_p() %>% modify_header(label ~ "**Vessel**") %>% modify_footnote(everything() ~ NA) # 可选:移除默认脚注
2. 直接在tbl_summary中自定义统计逻辑
无需修改原始数据,使用statistic参数指定统计规则,直接计算出现病例数和占比:
test |> tbl_summary( by = group, missing = "no", statistic = all_continuous() ~ "{n_nonzero} ({p_nonzero}%)", digits = all_continuous() ~ c(0, 1) ) %>% add_p(test = all_continuous() ~ fisher.test) # 根据数据类型选择合适检验方法 modify_header(label ~ "**Vessel**")
其中{n_nonzero}统计数值>0的病例数,{p_nonzero}计算对应百分比,完全匹配需求。
原始数据的额外处理提示
从提供的原始数据片段看,Arteries是包含多血管组合的因子变量,若要生成独热编码列,可先用tidyr::separate_rows拆分多值,再结合dplyr::mutate和dplyr::across生成独热编码列,之后再用上述方法处理。
内容的提问来源于stack exchange,提问作者JLA
相关产品推荐
相关产品推荐

