本文首发于“生信补给站”公众号 https://mp.weixin.qq.com/s/fzxM38mGCahiuhzb0FdBxg
生信或者数据挖掘中经常会遇到需要把连续的表达量数据转为分类变量。比如基因表达量二分类进行后续的生存分析。
一 读入数据
读入TCGA的表达量数据,截取部分数据进行示范
#TCGA的表达量数据 #setwd() data <- read.csv("Expr_median.csv",header=TRUE,row.names=1,check.names=FALSE) data <- as.data.frame(t(data)) data[1:4,1:4]
- row.names=1 :读入数据的第一列作为行名
- check.names=FALSE:标题保持原样
可以自行试一下,分别去掉这两个参数,然后比较下数据的差异
二 批量转化
1 ifelse转化单一列
#将TCGA-97-7938-01A根据medain转为 高 低 data1 <- data data1[,"ENSG00000000003.13"] <- ifelse(data1[,"ENSG00000000003.13"] > median(data1[,"ENSG00000000003.13"]),"High","Low") data1[1:4,1:4]
可以看到ENSG00000000003.13基因的表达量已经转为高 低 二分类了。
分段阈值:还可以是均值,四分卫,10%,或者具体数值
#按照均值分 data1[,"ENSG00000000460.15"] <- ifelse(data1[,"ENSG00000000460.15"] > mean(data1[,"ENSG00000000460.15"]),"High","Low") #按照75%分 data1[,"ENSG00000000419.11"] <- ifelse(data1[,"ENSG00000000419.11"] > quantile(data1[,"ENSG00000000419.11"],0.75),"High","Low") #按照具体数值分 data1[,"ENSG00000000457.12"] <- ifelse(data1[,"ENSG00000000457.12"] > 10,"High","Low") data1[1:4,1:4]
2 批量转化
当列数较少时,可以按照上述方式,一个个完后分类。当太多时,需要批量完成!
#使用apply,批量完成转化 data2 <- data data2 <- apply(data2, 2, function(x) {ifelse(x >= median(x), "hign", "low")}) head(data2)
批量已完成,省时省力!
3 for循环完成
data3 <- data for (i in colnames(data3)){ data3[,i] <- ifelse(data3[,i] >= median(data3[,i]),"high","low") }
实现方式很多,根据个人习惯,自取!