【if条件、for循环、数据框连接、表达矩阵画箱线图】

编程能力,就是解决问题的能力,也是变优秀的能力

From 生物技能树 R语言基础第七节

文章目录

  • 1.长脚本管理方式
    • if(F){....}
    • 分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空再加载
  • 2.实战项目的组织方式
    • 方法(一)
    • 方法(二)
    • 在这里插入图片描述
  • 3.条件和循环
    • if条件语句
    • if(){ } 如果。。。就。。。
    • if(){ } else{ },如果。。。就。。。否则。。。
    • 重点:ifelse函数
    • ifelse()+str_detect(),王炸
    • 多个条件
    • case_when
    • 练习7-2
  • 4.for循环
    • 批量画图
    • 批量装包
  • 5.隐式循环
    • 矩阵/数据框的隐式循环-apply()族函数
    • lapply(list, FUN, …)
  • 思考题:
    • 1.如何挑出一个数里最大的5个?
  • 课后思考题:
    • 2.如何挑出一个表达矩阵里方差最大的1000个基因?(test2.Rdata里有表达矩阵)
  • 6.两个数据框的连接
    • inner_join:取交集
    • full_join:全连接
    • left_join:左连接
    • right_join:右连接
    • 练习7-3:
  • 7.表达矩阵画箱线图(难懂)
  • 8.一些顶呱呱的函数
    • 遇到报错困惑
      • 找不到文件
      • 找不到函数
      • 不存在包
      • 找不到对象
    • R语言重点
    • 1.match-----
    • 2.一些搞文件的函数----


1.长脚本管理方式

if(F){…}

1.if(F){....},则{ }里的代码被跳过
if(T){....},则{ }里的代码被运行
凡是带有{ }的代码,均可以被折叠。

if(F){a=1b=a^2d=a+b+a^2
}if(T){a=1b=a^2d=a+b+a^2
}

#凡是带有{ }的代码,均可以被折叠。在这里插入图片描述
使用情况 1:例如下载数据的代码,保留但不反复运行

分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空再加载

在这里插入图片描述

save(pd,exp,gpl,file = "steplouput.Rdata")
#把第一个脚本产生的几个有效变量存下来了,存到Rdata里边,下次直接load Rdata

rm(list = ls()) #每个脚本运行之前都记得清空环境变量哦

为什么用Rdata而不是表格文件来衔接
1.变量,自带变量名称,不需要赋值,也没有参数
2.表格文件,需要赋值,读取参数的不同会导致读取结果不同,不能在后续代码里同等处理。
3.Rdata可以一次保存多个变量,下次只需要一次load就能得到多个数据。
4.Rdata不仅可以保存数据框,还可以保存其他任何数据结构。

2.实战项目的组织方式

方法(一)

在这里插入图片描述

方法(二)

每一步设置一个文件夹,每一个文件夹里都有一个project,一个文件夹和另一个文件夹作为工作目录的时候就涉及到工作目录的切换了

#相对路径,不推荐使用绝对路径
../  工作目录的上一级,可以访问隔壁文件夹的project

在这里插入图片描述


3.条件和循环

if条件语句

if(){ } 如果。。。就。。。

(1)只有if没有else,那么条件是FALSE时就什么都不做
提示:if()的括号里是一个逻辑值,不可以是多个逻辑值组成的向量

i = -1
if (i<0) print('up')[1] "up"if (i>0) print('up')

理解下面代码
就是之前用来装包的代码

if(!require(tidyr)) install.packages('tidyr')

if(){ } else{ },如果。。。就。。。否则。。。

(2)有else

i = -1
if (i>0){print('+')
} else {print("-")
}

重点:ifelse函数

在这里插入图片描述

> ifelse(i>0,"+","-")
[1] "-"
> x = rnorm(3)
> x
[1] -1.6343950  0.1812335  0.4729793
> ifelse(x>0,"+","-")
[1] "-" "+" "+"

ifelse()+str_detect(),王炸

library(stringr)
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE
ifelse(k1,"tumor","normal")
[1] "tumor"  "tumor"  "tumor"  "normal" "normal" "normal"
#此刻代码也不会报错,但是输出错误
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k2 = str_detect(samples,"normal");k2
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
ifelse(k2,"tumor","normal")
[1] "normal" "normal" "normal" "tumor"  "tumor"  "tumor" 
#更改为
ifelse(k2,"normal","tumor")
[1] "tumor"  "tumor"  "tumor"  "normal" "normal" "normal"

多个条件

#else后面直接跟if就可以实现多个条件
i = 0
if (i>0){print('+')
} else if (i==0) {print('0')
} else if (i< 0){print('-')
}[1] "0"
#两个==是比较运算

或者写嵌套,一样的效果

ifelse(i>0,"+",ifelse(i<0,"-","0"))[1] "0"

case_when

#让代码变得容易读,最后一种情况~前面写T就行
x = c(-1,-1,4,5,2,0)
case_when(x > 0 ~ "A",x == 0 ~ "0",T ~ "B")[1] "B" "B" "A" "A" "A" "0"

练习7-2

1.加载deg.Rdata,根据a、b两列的值,按照以下条件生成向量x:
#a< -1 且b<0.05,则x对应的值为down;
#a>1 且b<0.05,则x对应的值为up;
#其他情况,x对应的值为no
#统计up、down、no各出现了多少次
#提示:ifelse函数

#方法一
load("deg.Rdata")
k1 = deg$a < -1 & deg$b < 0.05
k2 = deg$a > 1 & deg$b < 0.05
x = table(case_when(k1 ~ "down",k2 ~ "up",T ~ "no"))
x
#也可以
load("deg.Rdata")
k1 = deg$a < -1 & deg$b < 0.05;table(k1)
k2 = deg$a > 1 & deg$b < 0.05;table(k2)
x = case_when(k1 ~ "down",k2 ~ "up",T ~ "no")
table(x)
#方法二
x = table(ifelse(k1,"down",ifelse(k2,"up","no")));x#运行结果down    no    up 1059 28863   853 

4.for循环

#对x里的每个元素i进行同一操作
格式:for( i in x){CODE}
for( i in 1:4){print(i)
}## [1] 1
## [1] 2
## [1] 3
## [1] 4

i遍历x的值,当运行完最后一个x的值的时候,就会停下

批量画图


#批量画图,#把画板分隔成4,#用4列画4张图
par(mfrow = c(2,2))
for(i in 1:4){plot(iris[,i],col = iris[,5])
}

在这里插入图片描述

批量装包

#批量装包
pks = c("tidyr","dplyr","stringr")
for(g in pks){if(!require(g,character.only = T))install.packages(g,ask = F,update = F)
}

5.隐式循环

矩阵/数据框的隐式循环-apply()族函数

1.apply 处理矩阵或数据框
apply(X, MARGIN, FUN, …)

其中X是数据框/矩阵名

MARGIN为1表示行,为2表示列,FUN是函数

对x的每一行/每一列进行FUN函数

rm(list = ls())
test<- iris[1:6,1:4]apply(test, 2, mean) ##对每一列求平均值
apply(test, 1, sum)  ##对每一行求总和,结果是一个向量,上面的一行是向量的名字

lapply(list, FUN, …)

对列表/向量中的每个元素实施相同的操作

lapply(1:4,rnorm)## [[1]]
## [1] -0.844006
## 
## [[2]]
## [1] 1.3602517 0.2277469
## 
## [[3]]
## [1]  0.5345012 -0.7476097 -0.8925600
## 
## [[4]]
## [1] -0.8469975  0.2791090 -0.5900125  0.3493904

#输出结果是list

思考题:

1.如何挑出一个数里最大的5个?

方法一:x = rnorm(30);xx <- sort(x,decreasing = T)head(x,5)}方法二:x = rnorm(30);xsort(x)tail(sort(x),5)#[1] 2.430152 2.030683 1.338829 1.095946 0.754246

找topn差异基因的思路,有时候依靠排序就能很好的解决

课后思考题:

2.如何挑出一个表达矩阵里方差最大的1000个基因?(test2.Rdata里有表达矩阵)

1.计算每个基因的方差
2.每个基因的方差排序
3.最后1000个数字所对应的基因

#统计元素
x = list(a = 1:10,b = rnorm(16),c = seq(1,3,0.1))
lapply(x,length)##$a
[1] 10
##$b
[1] 16
##$c
[1] 21
#查看数据类型x = list(a = 1:10,b = rnorm(16),c = seq(1,3,0.1))
lapply(x,class)##$a
[1] "integer"
##$b
[1] "numeric"
##$c
[1] "numeric"
x = list(a = 1:10,b = rnorm(16),c = seq(1,3,0.1))
sapply(x,sum)##> sapply(x,sum)a          b          c 
55.0000000 -0.4830007 42.0000000 

6.两个数据框的连接

inner_join:取交集

> test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'), 
+                     blood_type = c("A","B","O","AB"))
> test1name blood_type
1  jimmy          A
2 nicker          B
3  Damon          O
4 Sophie         AB
> test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
+                     group = c("group1","group1","group2","group2"),
+                     vision = c(4.2,4.3,4.9,4.5))
> test2name  group vision
1  Damon group1    4.2
2  jimmy group1    4.3
3 nicker group2    4.9
4   tony group2    4.5
> library(dplyr)
> inner_join(test1,test2,by="name")name blood_type  group vision
1  jimmy          A group1    4.3
2 nicker          B group2    4.9
3  Damon          O group1    4.2
> 

full_join:全连接

##全连接:取并集,多出来的行空着NA
> full_join(test1,test2,by="name")name blood_type  group vision
1  jimmy          A group1    4.3
2 nicker          B group2    4.9
3  Damon          O group1    4.2
4 Sophie         AB   <NA>     NA
5   tony       <NA> group2    4.5

left_join:左连接

左边表里的留下,右边表里的舍去

#左连接:以左边的数据框为准,右边多余的去掉,并连接
> left_join(test1,test2,by="name")
> name blood_type  group vision
1  jimmy          A group1    4.3
2 nicker          B group2    4.9
3  Damon          O group1    4.2
4 Sophie         AB   <NA>     NA

right_join:右连接

#右连接:以右边的数据框为准,左边多余的去掉,并连接

right_join(test1,test2,by="name")
    name blood_type  group vision
1  jimmy          A group1    4.3
2 nicker          B group2    4.9
3  Damon          O group1    4.2
4   tony       <NA> group2    4.5

练习7-3:

  1. 加载test1.Rdata,将两个数据框按照probe_id列连接在一起,按共同列取交集
load("test1.Rdata")
library(dplyr)
inner_join(dat,ids,by="probe_id")
  1. 找出logFC最小的10个基因和logFC最大的10个基因(symbol列就是基因名)
load("test1.Rdata")
library(dplyr)
#取交集两种方式
x = inner_join(dat,ids,by="probe_id")
或
x = merge(dat,ids,by="probe_id")
#正在对数据框 x 根据 logFC 列进行排序,并把排序后的数据框重新赋值给变量 x。
x = arrange(x,logFC)
#取出最大的前十个
head(x$symbol,10)
#取出最小的后十个
tail(x$symbol,10)

7.表达矩阵画箱线图(难懂)

#在R语言中,set.seed() 函数用于设置随机数生成器的种子set.seed(10086)
rnorm(10)
# 表达矩阵#设置随机种子
set.seed(10086)
#生成了随机数矩阵,共6,
创建一个63行的矩阵,包含从正态分布中抽取的18个随机数
exp = matrix(rnorm(18),ncol = 6)
#取整函数,或取小数点后几位,2为取小数点后2位
exp = round(exp,2)
#生成行名和列名
rownames(exp) = paste0("gene",1:3)
colnames(exp) = paste0("test",1:6)
#让1~3列数据都+1
exp[,1:3] = exp[,1:3]+1
exp
##输出结果print(exp)test1 test2 test3 test4 test5 test6
gene1  1.55  1.49  1.80 -0.37 -1.82 -1.62
gene2 -1.74  0.37  2.08  2.11 -0.22  1.42
gene3  1.57  1.25  1.32  2.49  0.58 -0.8

接下来进行变形的操作,让exp这个矩阵变成ggplot2可以接受的格式

首先需要把表达矩阵(宽型数据)变成长型数据:把所有的信息都置于同一行上
行名需要+1列另外放置,以防丢失

library(tidyr)
library(tibble)
library(dplyr)
#t() 函数用于转置矩阵,即交换矩阵的行和列。
dat = t(exp) %>%  
#将转置后的矩阵转换为数据框(data frame)  as.data.frame() %>%   
#这个函数将数据框的行名作为一列添加到数据框中。注意,这个函数是 tibble 包提供的,所以确保已经安装并加载了 tibble rownames_to_column() %>%  
#mutate() 函数用于添加新的列到数据框中。这里,它添加了一个名为 group 的新列,该列是通过 rep() 函数重复 "control" "treat" 字符串来生成的,每个字符串重复3次。mutate(group = rep(c("control","treat"),each = 3)) 

分步进行宽变长:
先把矩阵转置
变成数据框
把rownames变成一列
手动设置一下组别

 pdat = dat%>% pivot_longer(cols = starts_with("gene"),names_to = "gene",values_to = "count")
print(pdat)

也可以直接用宽变长的函数pivot_longer

cols=指要变成同一列的基因名

names_to指新的基因名那一列的列名

values_to指数值那一列的列名

剩下的内容会跟着一起变化

> print(pdat)
# A tibble: 18 × 4rowname group   gene  count<chr>   <chr>   <chr> <dbl>1 test1   control gene1  1.552 test1   control gene2 -1.743 test1   control gene3  1.574 test2   control gene1  1.495 test2   control gene2  0.376 test2   control gene3  1.257 test3   control gene1  1.8 8 test3   control gene2  2.089 test3   control gene3  1.32
10 test4   treat   gene1 -0.37
11 test4   treat   gene2  2.11
12 test4   treat   gene3  2.49
13 test5   treat   gene1 -1.82
14 test5   treat   gene2 -0.22
15 test5   treat   gene3  0.58
16 test6   treat   gene1 -1.62
17 test6   treat   gene2  1.42
18 test6   treat   gene3 -0.81
library(ggplot2)
p = ggplot(pdat,aes(gene,count))+geom_boxplot(aes(fill = group))+theme_bw()
p

在这里插入图片描述

8.一些顶呱呱的函数

match()
dir()
file.create()
file.exists()
file.remove()

遇到报错困惑

找不到文件

原因:工作目录有问题,应该用project打开Rstudio,在写文件的时候用tab键自动补齐

找不到函数

用tab键自动补齐,检查函数名称,是否在R包里的函数,没有加载R包

不存在包

安装即可

找不到对象

引号,或赋值

R语言重点

在这里插入图片描述

1.match-----

2.一些搞文件的函数----


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1424656.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

卷轴分红商城模式:适用于多种的商业营销模式

卷轴分红商城模式是一种基于区块链技术的去中心化积分商城系统&#xff0c;通过智能合约和数字资产分红实现积分流通和价值回馈&#xff0c;适用于多种场景。 什么是卷轴分红商城模式&#xff1a; 这是一个去中心化的积分商城系统&#xff0c;消费者在商城消费时&#xff0c;可…

Blender 导入资源包的例子

先到清华源下载资源包&#xff1a; Index of /blender/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/blender/demo/asset-bundles/human-base-meshes/human-base-meshes-bundle-v1.1.0.zip 解压/hum…

AI预测体彩排3采取878定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月15日预测第1弹

昨天与一位玩排3的彩友通过视频直播的形式聊了下&#xff0c;受益匪浅&#xff0c;给我提供了一些比较有价值的建议&#xff0c;比如&#xff0c;对于878的定位策略&#xff0c;方向是没问题的&#xff0c;但是8783的话&#xff0c;还是缺乏一定的命中率&#xff0c;如果87823&…

不干人事的表达式:(void)0

assert是C语言的一个宏。在<assert.h>中可以找到它的定义&#xff1a; #ifdef NDEBUG#define assert(_Expression) ((void)0) #else /* !defined (NDEBUG) */// 省略... #endif /* !defined (NDEBUG) */ 其用法在“捕捉错误的assert”一文中已有说明。 决定assert是否…

【利用数组处理批量数据-谭浩强配套】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

数字集成电路物理设计[陈春章]——知识总结与精炼02

第二章 物理设计建库与验证 2.1 集成电路工艺与版图 自行了解&#xff0c;关于闩锁效应可查阅小编之前的文章。 2.2 设计规则检查&#xff08;DRC&#xff09; 定义&#xff1a;晶圆代工厂对各自不同工艺参数制定出满足芯片制造良率的同一工艺层及不同工艺层之间几何尺寸的…

镭速助力企业加密上传大文件

在当代的数字化社会中&#xff0c;海量数据已成为我们日常生活的一个不可分割的组成部分。尤其是对于企业来说&#xff0c;如何在互联网上安全地传输庞大数据文件&#xff0c;是一个至关重要的问题。本文将深入探讨镭速技术如何利用加密手段&#xff0c;安全地将大型数据文件上…

一种请求头引起的跨域问题记录(statusCode = 400/CORS)

问题表象 问题描述 当我们需要在接口的headers中添加一个自定义的变量的时候&#xff0c;前端的处理是直接在拦截器或者是接口配置的地方直接进行写&#xff0c;比如下面的这段比较基础的写法&#xff1a; $http({method: "post",url:constants.backend.SERVER_LOGIN…

用docker命令行操作远程的Dockerd daemon服务

本地安装 Dockerd 服务太耗本机磁盘空间了&#xff0c;共用已有的Dockerd服务能够节省一部分空间 修改 Dockerd 服务启动文件&#xff0c;增加TCP监听方式 Dockerd 服务默认监听方式为 Unix Domain Socket &#xff0c;只允许本机连接&#xff0c;想要能够远程连接&#xff0…

TEMU电商行情分析:未来趋势与盈利机遇探讨

近年来&#xff0c;跨境电商行业风起云涌&#xff0c;其中TEMU作为新兴力量&#xff0c;其市场表现备受关注。那么&#xff0c;TEMU电商现在的行情究竟如何?对于卖家而言&#xff0c;是否仍然是一个能够赚钱的平台呢? 首先&#xff0c;从市场趋势来看 TEMU电商正处于一个快速…

没有疯狂内卷的日本智能机市场,小屏与设计仍旧是主流

如果聊起国内的智能机市场&#xff0c;我想大多数人的印象就是疯狂内卷。卷影像、卷屏幕、卷快充、卷性能……客观地说&#xff0c;国内的3C产品还是很有质价比的。不过在没有如此内卷的日本市场&#xff0c;各种小屏手机仍旧是主流。 除了苹果外&#xff0c;日本本土品牌的夏普…

【Python报错】Python安装模块时报错Fatal error in launcher

【Python报错】Python安装模块时报错Fatal error in launcher 最近需要用到python下载一个小工具&#xff0c;自信敲下回车键本想看到黑乎乎的终端上会出现快速跳跃的命令代码&#xff0c;没想到&#xff0c;报错了...... Fatal error in launcher: Unable to create process …

【半夜学习MySQL】复合查询(含多表查询、自连接、单行/多行子查询、多列子查询、合并查询等详解)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 回顾基本查询多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 回顾基本查询 下面使用…

ChatGPT4O:自然语言交互

ChatGPT 4O&#xff1a;引领自然语言处理的新纪元 一、技术细节与强大功能二、创新点与技术突破三、应用场景与商业化前景 在科技的浪潮中&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域一直备受关注。最近&#xff0c;OpenAI公司发布了其最新的NLP模型——ChatGPT …

Springboot+Vue项目-基于Java+MySQL的火锅店管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【C++】学习笔记——多态_1

文章目录 十二、继承8. 继承和组合 十三、多态1. 多态的概念2. 多态的定义和实现虚函数重写的两个特殊情况override 和 final 3. 多态的原理1. 虚函数表 未完待续 十二、继承 8. 继承和组合 我们已经知道了什么是继承&#xff0c;那组合又是什么&#xff1f;下面这种情况就是…

集成了Gemini的Android Studio,如虎添翼

今天将Android Studio升级到最新版&#xff08;Jellyfish&#xff09;。发现在new features中有一条&#xff1a; Code suggestions with Gemini in Android Studio 打开路径为&#xff1a; View > Tool Windows > Gemini 支持多国语言&#xff0c;英文、中文都能正确理解…

PSAI超强插件来袭:一键提升设计效率!

无需魔法&#xff0c;直接在PS中完成图生图、局部重绘、线稿上色、无损放大、扩图等操作。无论你是Windows还是Mac用户&#xff0c;都能轻松驾驭这款强大的AI绘图工具&#xff0c;这款PSAI插件让你的设计工作直接起飞&#xff01; 在之前的分享中&#xff0c;我为大家推荐过两…

BUUCTF靶场[MISC]荷兰宽带数据泄露、九连环

[MISC]荷兰宽带数据泄露 考点&#xff1a;查看路由器恢复丢失密码的文件 工具&#xff1a;RouterPassView——路由器密码查看工具 工具链接&#xff1a;https://routerpassview.en.lo4d.com/windows RouterPassView是一款老牌的路由器密码查看器&#xff0c;可以一键获取路…

暴利的副业兼职,抖音蓝海赛道,批量复制这个项目,1年200个

在有小孩的家庭中&#xff0c;父母都非常重视孩子的教育&#xff0c;并愿意为此投入大量资金。根据之前的新闻报道&#xff0c;有些父母会毫不犹豫地为孩子花费数千甚至上万元报名参加各种培训课程。尤其是在独生子女家庭中&#xff0c;家长更注重培养孩子的各方面能力。 周周近…