生信学习——生信人的20个R语言习题(上)(附详细答案解读)

2023-11-07

题目目录


写在前面——这次的R语言习题比上次的中级题目做起来舒服一些。花了四五天的时间整理了一下,因为题目太长,所以划分成两篇文章来写。不过还有地方不明白,先挖个坑,之后来填。需要代码文件的私信我即可。

题目原文:http://www.bio-info-trainee.com/3409.html
参考答案:https://www.jianshu.com/p/dd4e285665e1 https://www.jianshu.com/p/dd4e285665e1
参考答案:https://www.jianshu.com/p/c62cbb9e1a2e
下篇指路:https://blog.csdn.net/narutodzx/article/details/119775994

1. 安装一些R包。

数据包: ALL, CLL, pasilla, airway
软件包:limma,DESeq2,clusterProfiler
工具包:reshape2
绘图包:ggplot2
不同领域的R包使用频率不一样,在生物信息学领域,尤其需要掌握bioconductor系列包。

# R包的安装一般分为两种

# 1.对于bioconductor的安装。可在下面的网站中查询包是否属于bioconductor系列
# https://www.bioconductor.org/packages/release/BiocViews.html#___Software
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
BiocManager::install(c('ALL','CLL','pasilla','clusterProfiler')) 
BiocManager::install(c('airway','DESeq2','edgeR','limma'))

# 2.对于普通包的安装
install.packages("reshape2", "ggplot2")


2. 了解ExpressionSet对象,比如CLL包里面就有data(sCLLex),找到它包含的元素,提取其表达矩阵(使用exprs函数),查看其大小。

  1. 参考:http://www.bio-info-trainee.com/bioconductor_China/software/limma.html
  2. 参考:https://github.com/bioconductor-china/basic/blob/master/ExpressionSet.md

在这里插入图片描述

文章地址:https://www.bioconductor.org/packages/release/bioc/vignettes/Biobase/inst/doc/ExpressionSetIntroduction.pdf

ExpressionSet 类旨在将多个不同的信息源组合到一个方便的结构中。 
ExpressionSet 可以方便地操作(例如,子集化、复制),并且是许多 Bioconductor 函数的输入或输出。

ExpressionSet类包含:
assayData:微阵列表达数据
phenodata:实验样本的描述
featuredata:实验所用芯片或技术的特点
annotation:注释信息
experimentData:描述实验的一种灵活结构
suppressPackageStartupMessages(library(CLL))
data("sCLLex")
sCLLex

# 获得表达矩阵
exprSet <- exprs(sCLLex)
class(exprSet)
dim(exprSet)

#查看样本编号
sampleNames(sCLLex) 
#查看所有表型变量
varMetadata(sCLLex) 
#查看基因芯片编码
featureNames(sCLLex)[1:100] 

# 取sCLLex中phenoData中的data
pdata <- pData(sCLLex)
group_list <- as.character(pdata[,2])
table(group_list)

在这里插入图片描述
在这里插入图片描述


3. 了解 str,head,help函数,作用于第二步提取到的表达矩阵。

# 展示内部结构
str(exprSet)

# 默认展示前6行
head(exprSet)

# 提供帮助文档
help("sCLLex")

在这里插入图片描述

4. 安装并了解hgu95av2.db包,看看ls(“package:hgu95av2.db”)后显示的那些变量。

# 使用bioconductor系列包的安装方法
BiocManager::install("hgu95av2.db")
suppressPackageStartupMessages(library(hgu95av2.db))
ls("package:hgu95av2.db")

在这里插入图片描述


5. 理解head(toTable(hgu95av2SYMBOL))的用法,找到 TP53 基因对应的探针ID。

# 提供标识符和基因缩写之间的映射(probe_id和symbol的对应关系)
?hgu95av2SYMBOL

# toTable()是S4的一个泛型函数,可以替代as.data.frame()
?toTable

# Lkeys;探针总数是12625,能匹配上的是11683个;
# Rkeys:基因名的总数是62044,实际上只有8776种
# 原因:一般多个探针对应一个基因,取最大表达值探针来作为基因的表达量
summary(hgu95av2SYMBOL)

ids <- toTable(hgu95av2SYMBOL)
# head(ids)
# 正则表达式:https://www.runoob.com/regexp/regexp-syntax.html
ids[grep("^TP53$", ids$symbol),]
# 也可以直接打开ids,在搜索框中搜索TP53(同R语言小作业-中级-第3题)

在这里插入图片描述


6. 理解探针与基因的对应关系,总共多少个基因,基因最多对应多少个探针,是哪些基因,是不是因为这些基因很长,所以在其上面设计多个探针呢?

# 探针与基因是多对一的关系
# 对symbol去重然后查看长度,总共有8776个基因
length(unique(ids$symbol))

# 统计symbol中每个基因出现的次数,然后排序取其尾部
# 所得结果即可看出对应探针数目最多的基因
tail(sort(table(ids$symbol)))

# 统计对应不同探针数目的基因
table(sort(table(ids$symbol)))

# 因为基因长度远大于探针长度,所以一般一个基因对应多个探针

在这里插入图片描述


7. 第二步提取到的表达矩阵是12625个探针在22个样本的表达量矩阵,找到那些不在hgu95av2.db包收录的对应着SYMBOL的探针。

  1. 提示:有1165个探针是没有对应基因名字的。
# 统计exprSet中的探针在ids中的存在情况
# FALSE表示不存在,反之亦然
# 在这里为942,而不是1165,怀疑是因为包更新了...
table(rownames(exprSet) %in% ids$probe_id)

# 将exprSet中与ids中不对应的探针提取出来
# %in%是一个二元操作符,返回其左操作数长度的逻辑向量,指示其中的元素是否匹配
new_exprSet <- exprSet[!(rownames(exprSet) %in% ids$probe_id),]
dim(new_exprSet)

在这里插入图片描述


8. 过滤表达矩阵,删除那942个没有对应基因名字的探针。

# 将上一题的取反(!)删除即可
exprSet <- exprSet[(rownames(exprSet) %in% ids$probe_id), ]
dim(exprSet)

在这里插入图片描述


9. 整合表达矩阵,多个探针对应一个基因的情况下,只保留在所有样本里面平均表达量最大的那个探针。

  1. 提示,理解 tapply,by,aggregate,split 函数 , 首先对每个基因找到最大表达量的探针。
  2. 然后根据得到探针去过滤原始表达矩阵。
# 将ids中与exprSet不对应的探针删去
# match返回其第一个参数在第二个参数中的(第一个)匹配位置的向量
ids <- ids[match(rownames(exprSet),ids$probe_id),]
dim(ids)
# match(rownames(exprSet),ids$probe_id)
# head(ids)
# exprSet[1:5,1:5]

# 数据帧被行分割成由一个或多个因子的值子集的数据帧,函数FUN依次应用于每个子集
# 首先根据ids中的symbol,在exprSet中进行匹配,找到对应的行,计算平均表达量
# 挑出平均表达量最大的那一行,将其探针名保留
tmp <- by(exprSet,ids$symbol,function(x) rownames(x)[which.max(rowMeans(x))])
tmp[1:20]

# 将tmp转为字符型         
probes <- as.character(tmp)
# 保留在所有样本里面平均表达量最大的那个探针   
exprSet <- exprSet[rownames(exprSet) %in% probes, ]
dim(exprSet)
dim(ids)

在这里插入图片描述

# 详细介绍一下by那一步

# 这里取ids中按symbol排序的前两个基因为例
# ids[,2]=='AADAC'会返回逻辑值,再与exprSet进行匹配
exprSet[ids[,2]=='AADAC',]
exprSet[ids[,2]=='AAK1',]

str(exprSet[ids[,2]=='AADAC',])
str(exprSet[ids[,2]=='AAK1',])

# 匹配AADAC时,因为只有对应一个探针,所以维度跟其他多对一的不同
# 在这里报错了,但是放在by中能运行,可能自动给添加了维度,这里不明白...
rowMeans(exprSet[ids[,2]=='AADAC',])
rowMeans(exprSet[ids[,2]=='AAK1',])

which.max(rowMeans(exprSet[ids[,2]=='AADAC',]))
which.max(rowMeans(exprSet[ids[,2]=='AAK1',]))

str(which.max(rowMeans(exprSet[ids[,2]=='AAK1',])))
rownames(exprSet[ids[,2]=='AAK1',])[which.max(rowMeans(exprSet[ids[,2]=='AAK1',]))]

# 这里其实最主要依据就是ids中的基因(symbol)与探针(probe_id)的对应关系
# 如果是一对多,则对多的探针求平均表达量,然后保留最大的那个
# 依次对所有基因进行操作即可

在这里插入图片描述

在这里插入图片描述


10. 把过滤后的表达矩阵更改行名为基因的symbol,因为这个时候探针和基因是一对一关系了。

# 注意此时exprSet和ids的行数还不同,需要把ids中多余的行去除
# 法一
ids <- ids[match(rownames(exprSet),ids$probe_id),]
dim(ids)
rownames(exprSet) <- ids$symbol
exprSet[1:5, 1:5]

# 法二,这个方法可以不用改变ids
rownames(exprSet) <- ids[match(rownames(exprSet),ids$probe_id),2]

在这里插入图片描述


11. 对第10步得到的表达矩阵进行探索,先画第一个样本的所有基因的表达量的boxplot,hist,density,然后画所有样本的这些图。

  1. 参考:http://bio-info-trainee.com/tmp/basic_visualization_for_expression_matrix.html
  2. 理解ggplot2的绘图语法,数据和图形元素的映射关系。
# 整理数据
library(reshape2)
m_exprSet <- melt(exprSet)
head(m_exprSet)

colnames(m_exprSet) <- c("symbol", "sample", "value")
head(m_exprSet)

m_exprSet$group <- rep(group_list, each = nrow(exprSet))
head(m_exprSet)

在这里插入图片描述

library(ggplot2)
# 单独画一个sample的图
ggplot(m_exprSet[m_exprSet[,2]=="CLL11.CEL", ], aes(x = sample, y = value, fill = group)) + geom_boxplot()
# 直接把所有sample都放在一起画
ggplot(m_exprSet, aes(x = sample, y = value, fill = group)) + geom_boxplot()
ggplot(m_exprSet, aes(x = sample, y = value, fill = group)) + geom_violin()

ggplot(m_exprSet, aes(x = value, fill = group)) + geom_histogram(bins = 200)
ggplot(m_exprSet, aes(x = value, fill = group)) + geom_histogram(bins = 200) + facet_wrap(vars(sample), nrow = 4)

ggplot(m_exprSet, aes(x = value, col = group)) + geom_density()
ggplot(m_exprSet, aes(x = value, col = group)) + geom_density() + facet_wrap(~sample, nrow = 4)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 箱线图美化
p <- ggplot(m_exprSet, aes(x = sample, y = value, fill = group)) + geom_boxplot()
# 计算value的平均值,并以点的形式加入图中
# fun.y被抛弃了,现在流行快乐(手动狗头)
p <- p + stat_summary(fun="mean", geom="point", shape=23, size=3, fill="red")
# 加个经典的暗光ggplot2主题,虽然我没看出来有啥变化
p <- p + theme_set(theme_set(theme_bw(base_size=20)))
# 把字体设置为粗体,修改一下横坐标的显示,把标题置空
p <- p + theme(text=element_text(face='bold'), axis.text.x=element_text(angle=30,hjust=1), axis.title=element_blank())
print(p)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生信学习——生信人的20个R语言习题(上)(附详细答案解读) 的相关文章

  • 什么是“理解”?如何在人工智能中定义“理解”?(what is understanding ?)

    这篇文章主要不是解释哲学上的 理解 而是在计算或者人工智能或是数学上定义 理解 对于人而言 理解似乎是一件简单的事情 在我们上课的时候我们能确切的知道是否理解老师所讲的内容 在我们看书的时候我们能确切的知道书中的内容我们是否理解 在我们与人
  • javascript使用方括号([])引用对象的属性和方法

    在JavaScript中 每个对象可以看作是多个属性 方法 的集合 引用一个属性 方法 很简单 即 对象名 属性 方法 名除此之外 还可以用方括号的形式来引用 对象名 属性 方法 名 注意 这里的方法名和属性名是一个字符串 而非原先点号后面
  • oday-------------powered by discuz! 7.2

    利用google搜索关键字 intxt powered by discuz 7 2 找到一个论坛 注册一个账号注册好后 使用exp http 此处为论坛地址 misc php action imme binding response res
  • 一种简单快速有效的低照度图像增强方法

    一种简单快速有效的低照度图像增强方法 一 本文介绍的是一种比较实用并且去阴影效果很好的方法 选自2004年Tao的一篇论文 名称是 An Integrated Neighborhood Dependent Approach for Nonl
  • 采编系统服务器架构,遂宁日报新闻采编系统的设计与实现

    摘要 新闻稿件采编系统是现今报社现代化办公的必备工具 它对于提高新闻报社工作效率和网络接轨有着重要的意义 随着现代社会中网络化 数字化的不断进步 单凭传统的系统加上纯手工的劳动已经越来越难以满足日报社新闻采编管理工作的需求 1 新闻稿件采编
  • python中csv、json文件的写入和读取

    txt文本文件读取 txt文本文件读取 def txt writter 写文件 函数说明文档 with open data txt w encoding utf 8 as f f write hi n 写一行 lines hello n w

随机推荐

  • Python 爬虫入门的教程(1小时快速入门、简单易懂、快速上手)

    这是一篇详细介绍 Python爬虫入门的教程 从实战出发 适合初学者 读者只需在阅读过程紧跟文章思路 理清相应的实现代码 30 分钟即可学会编写简单的 Python 爬虫 这篇 Python 爬虫教程主要讲解以下 5 部分内容 了解网页 使
  • Velodyne VLP16 激光雷达使用(遇到问题要学会看文档)

    VLP 16激光雷达是Velodyne公司出品的最小型的3维激光雷达 保留了电机转速可调节的功能 实时上传周围距离和反射率的测量值 VLP 16具有100米的远量程测量距离 精巧的外观设计使得安装非常方便 重量轻 只有830g 非常适合安装
  • ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊

    9月13日 Today消息 一位名叫Alex的4岁儿童得了一种浑身疼痛的怪病 每天需要服用Motrin 美林 才能止痛 3年的时间 看了17名医生无法确诊病因 新闻地址 https www today com health mom chat
  • C++ vector容器

    1 vector基本概念 vector 的数据结构和数组非常相似 也称为单端数组 不同之处在于数组是静态空间 而 vector 可以动态扩展 动态扩展 不是在原空间之后续接新空间 而是找更大的内存空间 然后将原数据拷贝新空间 释放原空间 使
  • 四位数码管3641AS的FPGA实现

    一 数码管介绍 四位数码管3641AS为一款共阴极的四位八段数码管 其具体的每一段为单个二极管 可通过压降实现点亮 通过控制单位多段二极管的点亮实现数字或字母等字符 共阴极 八段发光二极管的阴极端连接在一起 阳极端分开控制 使用时候公共端接
  • 这几款能制作思维导图的软件分享给你

    思维导图工具的优势在于它可以大大提高思考效率 使用思维导图工具 可以更好地组织和理解复杂的信息 并从中提取出重要的要素 此外 思维导图也可以帮助人们更好地记忆信息 接下来这篇文章 我将会介绍几款好用的思维导图软件 一起来看看吧 软件一 简道
  • Linux时间操作(time、gettimeofday)

    自 http blog chinaunix net space php uid 24148050 do blog id 320294 一 time函数 include
  • idea使用Markdown流程图

    环境 Windows10 idea2021 1 社区版 方法 其实主要就是让Markdown的mermaid生效 如何设置mermaid CTRL ALT S调出设置 搜索 Markdown 找到enable extend name 勾选后
  • Spark(30) -- Spark SQL中更多Parquet文件读写(scala)

    什么时候会用到 Parquet 在 ETL 中 Spark 经常扮演 T 的职务 也就是进行数据清洗和数据转换 为了能够保存比较复杂的数据 并且保证性能和压缩率 通常使用 Parquet 是一个比较不错的选择 所以外部系统收集过来的数据 有
  • Mysql this is incompatible with sql_mode=only_full_group_by

    MySQL的sql mode合理设置 sql mode是个很容易被忽视的变量 默认值是空值 在这种设置下是可以允许一些非法操作的 比如允许一些非法数据的插入 在生产环境必须将这个值设置为严格模式 所以开发 测试环境的数据库也必须要设置 这样
  • 标准库函数

    aplay apply 函数可以看作一个配置函数 你可以传入一个接收者 然后调用一系列函数来配置它以便使用 调用一个个函数类配置接收者时 变量名就省掉了 apply 能让每一个配置函数 都做用于接收者 这种行为叫做 相关作用域 apply
  • 01-iOS如何集成OpenCV

    转自 https www jianshu com p 13a302dfd8f0 OpenCV 是什么 简述 OpenCV是开源计算机视觉库 是一个非常强大的库 可跨平台使用 其中包含了数百种计算机视觉算法 OpenCV 是由C 编写 最早是
  • Redis配置与优化

    文章目录 Redis配置 优化 1 关系型数据库与非关系型数据库 1 1 定义 1 2 区别 1 3 产生背景 2 Redis 2 1 Redis简介 2 2 Redis优点 2 3 Redis缺点 2 4 Redis使用场景 2 5 Re
  • MQTT.fx连接阿里云

    第一步 查看阿里云设备 MQTT 参数 点击 设备 点击 设备信息 点击mqtt连接参数 查看 第2步 打开 MQTT fx 软件 点击 齿轮 点击 新建项目 输入项目名称 MQTT test 01 复制mqtt连接参数 clientId
  • GDAL库简介以及在Windows下编译过程

    GDAL Geospatial Data Abstraction Library 地理空间数据抽象库 是一个在X MIT许可协议下的开源栅格空间数据转换库 官网http www gdal org index html 也可参考GitHub
  • Could not connect to ‘192.168.203.128‘ (port 22): Connection failed.

    问题展示 请在保证虚拟机和宿主机之间完美连接之后 再看此篇文章 如何保证呢 操作请看这篇 Linux虚拟机与Windows宿主机间的通信 如何验证呢 当然是 ping 啊 虚拟机 ping 主机 通 主机 ping 虚拟机 通 通常情况下
  • obj文件

    obj 文件是一种常用的 3D 模型文件格式 它由许多顶点坐标 法向量和纹理坐标组成 可以用来描述复杂的三维模型 obj 文件是一种文本文件 可以使用纯文本编辑器打开 也可以使用专门的 3D 模型软件来打开 编辑和渲染 obj 文件通常与
  • 1800亿参数,世界顶级开源大模型Falcon官宣!碾压LLaMA 2,性能直逼GPT-4

    来源 新智元 导读 一经发布 地表最强开源模型Falcon 180B直接霸榜HF 3 5万亿token训练 性能直接碾压Llama 2 一夜之间 世界最强开源大模型Falcon 180B引爆全网 1800亿参数 Falcon在3 5万亿to
  • 电路中的输入与输出电阻计算

    电路的输入与输出电阻计算 前言 一 输入电阻 1 一端口网络的概念 一端口网络的特性 输入电阻的计算方法 前言 本人是大二电子系的一个学生 大二上在学习模电 当学习到各种BJT电路 FET电路 差分放大电路或负反馈放大电路时 新学习的增益计
  • 生信学习——生信人的20个R语言习题(上)(附详细答案解读)

    题目目录 1 安装一些R包 2 了解ExpressionSet对象 比如CLL包里面就有data sCLLex 找到它包含的元素 提取其表达矩阵 使用exprs函数 查看其大小 3 了解 str head help函数 作用于第二步提取到的