如何给R语言DataFrame添加基于三条件的threshold列
问题描述
现有如下R DataFrame:
dat <- data.frame( geneID = c("ENSG00000000003.14", "ENSG00000000419.12", "ENSG00000000457.13", "ENSG00000000460.16", "ENSG00000001036.13", "ENSG00000001084.10", "ENSG00000001167.14", "ENSG00000001460.17"), baseMean = c(2700.791337, 1571.143316, 526.2282051, 1108.138705, 2662.132047, 1325.447272, 1829.828657, 641.7582879), log2FoldChange = c(-0.345466785, -0.348258736, -0.051250213, -0.078538637, 0.121419414, 0.89, -0.221749678, -0.252419377), lfcSE = c(0.202389477, 0.150807514, 0.180482116, 0.167859597, 0.175209898, 0.154875429, 0.153100403, 0.183602552), stat = c(-1.706940451, -2.309293001, -0.283962835, -0.467882913, 0.692994033, -0.423289781, -1.448393819, -1.374814095), pvalue = c(0.087833121, 0.020927328, 0.776438862, 0.639868323, 0.488313296, 0.672083849, 0.147506943, 0.169189087), padj = c(0.001, 0.120478416, 0.003, 0.827329552, 0.728842774, 0.0004, 0.386446872, 0.417816879) )
需要添加名为threshold的列,满足以下规则:
- 当
log2FoldChange > 0且padj < 0.05时,标记为up - 当
log2FoldChange < 0且padj < 0.05时,标记为down - 其他情况标记为
NS
尝试了以下代码但未达到预期效果:
dat <- mutate(dat, threshold=if_else(dat$padj <= 0.05 & dat$log2FoldChange > 0,"up","NS")) dat <- mutate(dat, threshold=if_else(dat$padj <= 0.05 & dat$log2FoldChange < 0,"down","NS"))
错误原因
两次mutate操作会覆盖之前的结果:第一次标记的up会在第二次mutate中被重置为NS,因为第二次只处理log2FoldChange < 0的情况,不满足该条件的行都会被设为NS,导致之前的up标记丢失。
正确实现方法
方法1:嵌套if_else
在一次mutate中完成多条件判断,避免结果被覆盖:
library(dplyr) dat <- dat %>% mutate(threshold = if_else(padj < 0.05 & log2FoldChange > 0, "up", if_else(padj < 0.05 & log2FoldChange < 0, "down", "NS")))
方法2:使用case_when(更清晰,适合多条件场景)
case_when可以按顺序匹配条件,代码可读性更强,适合复杂的多分支判断:
library(dplyr) dat <- dat %>% mutate(threshold = case_when( padj < 0.05 & log2FoldChange > 0 ~ "up", padj < 0.05 & log2FoldChange < 0 ~ "down", TRUE ~ "NS" # 所有不满足上述条件的情况统一标记为NS ))
验证结果
运行上述代码后,得到的dat与期望输出一致:
print(dat) # geneID baseMean log2FoldChange lfcSE stat pvalue padj threshold # 1 ENSG00000000003.14 2700.7913 -0.345466785 0.20238948 -1.7069405 0.08783312 0.00100000 down # 2 ENSG00000000419.12 1571.1433 -0.348258736 0.15080751 -2.3092930 0.02092733 0.12047842 NS # 3 ENSG00000000457.13 526.2282 -0.051250213 0.18048212 -0.2839628 0.77643886 0.00300000 down # 4 ENSG00000000460.16 1108.1387 -0.078538637 0.16785960 -0.4678829 0.63986832 0.82732955 NS # 5 ENSG00000001036.13 2662.1320 0.121419414 0.17520990 0.6929940 0.48831330 0.72884277 NS # 6 ENSG00000001084.10 1325.4473 0.890000000 0.15487543 -0.4232898 0.67208385 0.00040000 up # 7 ENSG00000001167.14 1829.8287 -0.221749678 0.15310040 -1.4483938 0.14750694 0.38644687 NS # 8 ENSG00000001460.17 641.7583 -0.252419377 0.18360255 -1.3748141 0.16918909 0.41781688 NS
内容的提问来源于stack exchange,提问作者user3138373
相关产品推荐
相关产品推荐

