为何我的R代码筛选上调DEG时会纳入下调基因数据?
问题原因排查
- 核心错误:
upregulated_indices是用which()得到的索引数字向量(比如c(1,3,5)),而concentrations == unique_concentration[1]是逻辑向量(比如c(TRUE,FALSE,TRUE...))。当对这两种不同类型的向量做&运算时,R会自动把索引向量转换成逻辑向量(非零值为TRUE,零为FALSE),若向量长度不匹配会触发循环补齐,导致原本不符合upregulated条件的行被错误选中。 - 举个实例:假设
upregulated_indices是c(2,4),concentrations == "2nM"是c(TRUE,TRUE,FALSE,FALSE),索引向量会被转成c(FALSE,TRUE,FALSE,TRUE),和逻辑向量运算后得到c(FALSE,TRUE,FALSE,FALSE)——如果逻辑向量和索引向量长度不一致,循环补齐就会导致错误筛选出downregulated的行。
修复方案
方法1:直接组合逻辑条件(推荐)
无需先用which()取索引,直接把两个条件用&组合:
DEG_data <- read.csv(file = 'DEG_changes(1).csv', header = TRUE) # 定义upregulated的逻辑判断 is_upregulated <- DEG_data$changeDEG == "upregulated" # 按浓度筛选目标数据 upregulated_conc2nM <- DEG_data$numberDEGs[is_upregulated & DEG_data$concentration == unique(DEG_data$concentration)[1]] upregulated_conc5nM <- DEG_data$numberDEGs[is_upregulated & DEG_data$concentration == unique(DEG_data$concentration)[2]] upregulated_conc50nM <- DEG_data$numberDEGs[is_upregulated & DEG_data$concentration == unique(DEG_data$concentration)[3]]
方法2:先筛选upregulated子集再拆分
先提取所有upregulated的行,再从中按浓度拆分数据,可读性更强:
DEG_data <- read.csv(file = 'DEG_changes(1).csv', header = TRUE) # 先得到upregulated的完整子集 upregulated_data <- DEG_data[DEG_data$changeDEG == "upregulated", ] # 从子集里提取对应浓度的numberDEGs upregulated_conc2nM <- upregulated_data$numberDEGs[upregulated_data$concentration == unique(DEG_data$concentration)[1]] upregulated_conc5nM <- upregulated_data$numberDEGs[upregulated_data$concentration == unique(DEG_data$concentration)[2]] upregulated_conc50nM <- upregulated_data$numberDEGs[upregulated_data$concentration == unique(DEG_data$concentration)[3]]
额外简化方案
用dplyr包可以大幅简化筛选逻辑,代码更易读:
library(dplyr) DEG_data <- read.csv(file = 'DEG_changes(1).csv', header = TRUE) upregulated_data <- DEG_data %>% filter(changeDEG == "upregulated") upregulated_conc2nM <- upregulated_data %>% filter(concentration == unique(DEG_data$concentration)[1]) %>% pull(numberDEGs) # 同理处理5nM、50nM的筛选
内容的提问来源于stack exchange,提问作者jack is carbon
相关产品推荐
相关产品推荐

