You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

组合分析中mutate行致1/0反转,UpSetR绘图列名匹配异常求助

解决UpSetR组合分析列名与频率不匹配问题

问题根源

原参考代码是针对yes/no二元数据设计的,但你的数据是百分比数值+NA(无样本标记),直接套用原代码的列处理逻辑会出现两个核心问题:

  1. 原代码的start_col:end_col报错,是因为代码里的列索引逻辑和你的数据结构不匹配;
  2. 你修改的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:45:21