组合分析中mutate行致1/0反转,UpSetR绘图列名匹配异常求助
解决UpSetR组合分析列名与频率不匹配问题
问题根源
原参考代码是针对yes/no二元数据设计的,但你的数据是百分比数值+NA(无样本标记),直接套用原代码的列处理逻辑会出现两个核心问题:
- 原代码的
start_col:end_col报错,是因为代码里的列索引逻辑和你的数据结构不匹配; - 你修改的
mutate行逻辑完全错误——把NA转成1、非NA转成0,导致0/1反转,最终UpSetR绘图时列名和实际频率完全错位。
分步解决方案
1. 修正数据二元化逻辑
你的需求是:有样本(非NA的百分比)标记为1,无样本(NA)标记为0,但你写的as.integer(. %in% c("yes", NA))既错误匹配了不存在的"yes"值,又把NA转成了1,完全搞反了逻辑。
替换为正确的转换代码:
# 假设columns是你要分析的9列的列名向量 data <- data %>% mutate(across(all_of(columns), ~ as.integer(!is.na(.))))
!is.na(.)会判断当前值是否为非NA(即存在样本),转成整数后,非NA行变为1,NA行变为0,完全符合UpSetR需要的二元输入格式。
2. 修复UpSetR调用的列索引问题
原代码的start_col:end_col报错,是因为它依赖列的位置索引,容易出错。直接用sets参数指定你要分析的列名向量即可:
library(UpSetR) upset(data, sets = columns, # 直接传入列名向量,避免索引错误 order.by = "freq", # 按组合频率排序,确保高频组合靠前 keep.order = FALSE) # 让UpSetR自动按频率调整列的显示顺序
3. 验证转换结果
运行转换代码后,先检查前5行数据,确保转换逻辑正确:
# 查看目标列的转换结果 head(data[columns], 5)
确认原本有百分比的行显示为1,NA的行显示为0,这是后续频率计算正确的前提。
特殊情况处理
如果你的数据里存在值为0的百分比(代表有样本但占比为0,不是无样本),需要调整判断逻辑,区分NA(无样本)和0(有样本但占比0):
data <- data %>% mutate(across(all_of(columns), ~ as.integer(!is.na(.) & . != 0)))
内容的提问来源于stack exchange,提问作者Melanie A Kool
相关产品推荐
相关产品推荐

