J

Jay2Echo

V1

2022/11/25阅读:23主题:默认主题

R语言将数据表格化

背景

最近报名了生信技能树的实习,其中一个考核是Debug之前可以正常运行但是现在由于版本更新等原因出错的代码。生信技能树作为生信领域头部公众号,之前也是一直想好好啃一啃干货。现在借助这次实习机会好好成长一下吧~发现一个有意思的可视化函数。一图胜千言,现在越来越重视数据的可视化。自然,联想到之前做过项目中可视化临床基线表的内容,故一齐汇总。

利用“DT::datatable”函数将数据框转化为表格以网页形式展示

  • 下述代码首先通过常用的基因注释包“org.Hs.eg.db”得到基因的Symbol、name(感觉更像基因描述)、ID、alias name(别名);
  • 随后将上述数据保存为数据框(data frame)形式;
  • 最后通过“DT::datatable”函数将数据框转化为网页形式的表格并进一步保存至当前工作目录下;

注:"DT::datatable"的其他用法

注:代码中通过自定义函数“createLink”将基因ID号直接与网页进行超链接,值得学习。

rm(list=ls())

if (!requireNamespace("BiocManager", quietly = TRUE))
 install.packages("BiocManager")
library("BiocManager")
BiocManager::install("org.Hs.eg.db")


library(org.Hs.eg.db)
eg2symbol=toTable(org.Hs.egSYMBOL)
eg2name=toTable(org.Hs.egGENENAME)
eg2alias=toTable(org.Hs.egALIAS2EG)
eg2alis_list=lapply(split(eg2alias,eg2alias$gene_id),function(x){paste0(x[,2],collapse = ";")})
GeneList=mappedLkeys(org.Hs.egSYMBOL)
if( GeneList[1] %in% eg2symbol$symbol ){
  symbols=GeneList
  geneIds=eg2symbol[match(symbols,eg2symbol$symbol),'gene_id']
}else{
  geneIds=GeneList
  symbols=eg2symbol[match(geneIds,eg2symbol$gene_id),'symbol']
}
geneNames=eg2name[match(geneIds,eg2name$gene_id),'gene_name']
geneAlias=sapply(geneIds,function(x){ifelse(is.null(eg2alis_list[[x]]),"no_alias",eg2alis_list[[x]])})

createLink <- function(base,val) {
  sprintf('<a href="%s" class="btn btn-link" target="_blank" >%s</a>',base,val) 
  ##  target="_blank" 
}
gene_info=data.frame(   symbols=symbols,
                        geneIds=createLink(paste0("http://www.ncbi.nlm.nih.gov/gene/",geneIds),geneIds),
                        geneNames=geneNames,
                        geneAlias=geneAlias,
                        stringsAsFactors = F
)
#library("xtable") 
#print(xtable(gene_info), type="html",include.rownames=F, file='all_gene.anno',sanitize.text.function = force)
file='all_gene_bioconductor.html'
y <- DT::datatable(gene_info,escape = F,rownames=F)
DT::saveWidget(y,file)

临床领域常用基线表可视化

数据说明:

下述代码对三个数据集:radiomic、radiogenomic、TCGA中"OS_Status","OS_Time","Tumor_Local","Sex","Age","TNM_Stage"6个变量进行基线表统计。其中:

  • OS_Status:预后生存状态,死:1,生:0;
  • OS_Time:预后生存时间;
  • Tumor_local:肿瘤位置,结肠:1,直肠:0;
  • Sex:男:0,女:1;Age;
  • TNM_Stage:TNM分期I~IV;
  • 6个变量中除预后生存时间和年龄是连续变量外,其余都是分类变量。

操作过程:

  • 对于连续型变量首先进行正态检验(见代码);
  • 后续定义三个数据集中需要进行汇总的变量、分类变量、连续变量;
  • 随后通过"tableone::CreateTableOne"函数进行数据汇总;
  • 三个数据集的汇总信息分别保存为*.csv文件,后手动在excle中排版即可。

注:此函数包命名满满理科生的浪漫,医学类文章涉及到多个数据集总会有基线表,而且该表往往在表一(tableone)的位置。

# 获取TCGA临床数据
# 此为获得三个数据集临床数据用于制作基线表
## 除样本ID还包含"OS_Status","OS_Time","Tumor_Local","Sex","Age","TNM_Stage"数据
### OS_Status:预后生存状态,死:1,生:0
### OS_Time:预后生存时间
### Tumor_local:肿瘤位置,结肠:1,直肠:0
### Sex:男:0,女:1
### Age
### TNM_Stage:TNM分期I~IV

# draw baseline table
library(tableone)

radiomic_for_baseline <- read.csv("脱敏隐去/radiomic_baseline_data.csv")
radiomic_for_baseline <- radiomic_for_baseline[,-c(1:4)]

radiogenomic_for_baseline <- read.csv("脱敏隐去/radiogenomic_baseline_data.csv")
radiogenomic_for_baseline <- radiogenomic_for_baseline[,-c(1:5)]

TCGA_for_baseline <- read.csv("脱敏隐去/TCGA_baseline_data.csv")
TCGA_for_baseline <- TCGA_for_baseline[,-c(1:2)]

# 检验数据是否符合正态分布(数据大都位于y=x上,视为服从正态分布)

# qqnorm(radiomic_for_baseline$OS_time)

# qqline(radiomic_for_baseline$OS_time)

# 医学上大于50个样本使用此方法进行正态分布检验(P > 0.05视为符合正态分布)
if_Normal_distribution <- ks.test(radiomic_for_baseline$Age,"pnorm")

# 小于50个样本使用下述方法检验(P > 0.05视为符合正态分布)
# shapiro.test(radiomic_for_baseline$OS_time)  

# 经过检验发现三个数据集中,OS_time,Age均不符合正态分布

## 指定基线表中需要汇总的元素
myVars <- c("OS_Status","OS_Time","Sex","Age","Tumor_Local","TNM_Stage")

## 指定分类变量
catVars <- c("OS_Status","Sex","Tumor_Local","TNM_Stage")
tab2 <- CreateTableOne(vars = myVars, data = radiomic_for_baseline, factorVars = catVars)
#print(tab2, showAllLevels = TRUE) # 显示分类变量所有水平汇总表
### 连续性变量如符合正态分布则用“均数(标准差)”显示,非正态用“中位数(四分位数)”显示
### 分类变量用“个数(百分比)”显示
nonvar <- c("OS_Time","Age"# 指定非正态分布元素


my_tableone <- function(my_Vars,catVars,nonvar,data_for_baseline){
  tab_tmp <- CreateTableOne(vars = myVars, data = data_for_baseline, factorVars = catVars)
  tableone <- print(tab_tmp, nonnormal = nonvar, showAllLevels = TRUE)
  return(tableone)
}

radiomic <- my_tableone(my_Vars,catVars,nonvar,data_for_baseline = radiomic_for_baseline)
write.csv(radiomic, file = "脱敏隐去/radiomic_baseline_table.csv")

radiogenomic <- my_tableone(my_Vars,catVars,nonvar,data_for_baseline = radiogenomic_for_baseline)
write.csv(radiogenomic, file = "脱敏隐去/radiogenomic_baseline_table.csv")

TCGA <- my_tableone(my_Vars,catVars,nonvar,data_for_baseline = TCGA_for_baseline)
write.csv(TCGA, file = "脱敏隐去/TCGA_baseline_table.csv")

  • 推文多平台同步发布,公众号内容食用更佳
  • 更多内容,请关注微信公众号“生信矿工”

参考链接:

使用R语言获取人类所有基因的名字,ID,symbol以及别名

分类:

其他

标签:

医学

作者介绍

J
Jay2Echo
V1