使用tbl_merge合并表格后,如何过滤p值≥5%的观测行?
解决方法
要实现合并男女分群的tbl_hierarchical表格后过滤掉任意p值≥5%的行,核心思路是直接修改合并后表格的底层数据——因为合并后的对象不再是tbl_hierarchical,无法用filter_hierarchical,但可以通过修改其内置的table_body数据框来完成过滤,同时保留合并后的表格结构,避免合并前过滤丢失仅存在于单个表格的观测。
具体操作步骤
生成并合并男女分群的层级表格
先按性别筛选数据,分别生成tbl_hierarchical表格,再用tbl_merge合并:# 生成男性层级表格 tbl_male <- ADAE %>% filter(SEX == "M") %>% tbl_hierarchical( # 填入你的参数,比如term变量、统计量设置、p值计算逻辑等 term = AEDECOD, by = TRTA, statistic = list(all_categorical() ~ "{n}/{N} ({p}%)"), test = all_categorical() ~ chisq_test() ) # 生成女性层级表格 tbl_female <- ADAE %>% filter(SEX == "F") %>% tbl_hierarchical( term = AEDECOD, by = TRTA, statistic = list(all_categorical() ~ "{n}/{N} ({p}%)"), test = all_categorical() ~ chisq_test() ) # 合并两个表格 merged_tbl <- tbl_merge( list(tbl_male, tbl_female), tab_spanner = c("Male", "Female") )查看合并后表格的底层列名
先确认p值列的具体名称(合并后通常会命名为p.value_1、p.value_2,对应第一个和第二个输入表格的p值):# 打印底层数据框查看列名 print(merged_tbl$table_body)过滤p值≥5%的行
使用modify_table_body()直接修改合并后表格的底层数据,过滤掉任意一个p值≥0.05的行:filtered_tbl <- merged_tbl %>% modify_table_body(function(data) { # 过滤条件:只要男性或女性的p值≥0.05,就移除该行 data %>% filter(!(p.value_1 >= 0.05 | p.value_2 >= 0.05)) })(可选)清理空的父层级行
如果你的层级表格有父项(比如系统器官分类),过滤后可能出现父项没有子项的情况,可以额外添加逻辑删除这类空父行:filtered_tbl <- merged_tbl %>% modify_table_body(function(data) { # 第一步:过滤p值不符合条件的行 filtered_data <- data %>% filter(!(p.value_1 >= 0.05 | p.value_2 >= 0.05)) # 第二步:找出仍有子项的父层级 # 假设子项的term以父项term为前缀,用分隔符(比如.)区分 valid_parents <- filtered_data %>% filter(row_type == "level") %>% pull(term) %>% stringr::str_extract("^[^.]+") %>% unique() # 保留有子项的父层级,以及所有子项行 filtered_data %>% filter(row_type == "level" | term %in% valid_parents) })
内容的提问来源于stack exchange,提问作者Huan Lu
相关产品推荐
相关产品推荐

