前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生信技能树- R语言-day7

生信技能树- R语言-day7

原创
作者头像
VOHOKO
发布2024-04-20 23:33:32
860
发布2024-04-20 23:33:32

玩转字符串

1.检测字符串长度

str_length(x)

length(x)# 字符的个数

2.字符串拆分

str_split(x," ") # 把42个字符 按照“空格”拆分成八个字符串

class(str_split(x," ")) #确认是什么数据组合类型

x2 = str_split(x," ")[[1]];x2 #是list 所以用[[]]

y = c("jimmy 150","nicker 140","tony 152")

str_split(y," ")

str_split(y," ",simplify = T) #简化结果

拆分后的y需要赋值,不然还是原来的y

3.按位置提取字符串

str_sub(x,5,9) #空格也要算上 x字符串里5-9位置

4.字符检测

str_detect(x2,"h") # h类似于地雷,扫雷探测,含有h的就会变成TURE,生成长度相等的逻辑值向量,可以用来取子集,可以提出来含有h的地雷

str_starts(x2,"T") #是否以t开头

str_ends(x2,"e")#是否e结束

5.字符串替换

x2

str_replace(x2,"o","A") #如果向量里的一个数据有两个o,只替换第一个

str_replace_all(x2,"o","A") #如果向量里的一个数据有两个o,都替换

str_replace_all(x2,"o|e","A") # 竖线 代表着或者

6.字符删除

str_remove(x," ")

str_remove_all(x," ")

玩转数据框

arrange,数据框按照某一列排序

sort是给向量排序的

library(dplyr)

arrange(test, Sepal.Length) #默认根据这一列从小到大给整个数据框排序

arrange(test, desc(Sepal.Length)) #从大到小

distinct,数据框按照某一列去重复

unique 给向量去掉重复

duplicated 判断是否发生了重复(逻辑值关系,遇到第二次就变成ture)

distinct(test,Species,.keep_all = T)

mm[!duplicated(mm)] 提取没有重复的第一次出现的

mutate,数据框新增一列

mutate(test, new = Sepal.Length * Sepal.Width)

new是新产生的列名

新加之后,如果没有赋值,那么这个数据框还是没有新加,没有赋值,就没有产生

补充

select()

filter()

如何简化连续的步骤

1. 多次赋值,会产生多个中间的变量

x1 = select(iris,-5)

x2 = as.matrix(x1)

x3 = head(x2,50)

pheatmap::pheatmap(x3)

2. 嵌套,代码不易读

pheatmap::pheatmap(head(as.matrix(select(iris,-5)),50))

管道符号传递,简洁明了

iris %>%

select(-5) %>%

as.matrix() %>%

head(50) %>%

pheatmap::pheatmap()

玩转条件和循环

条件

if

if(一个逻辑值,不可以是多个逻辑值组成的向量){code }

控制code到底可运行

如果逻辑值是T,就运行

如果是F,就不运行。

if。。。else

if(一个逻辑值,不可以是多个逻辑值组成的向量){code1}

else{code2}

如果逻辑值是FALSE,就执行else里的code

0
0

ifelse

0
0

支持单个的逻辑值,也支持多个逻辑值组成的向量,根据逻辑值向量生成有两个取值的字符型向量

ifelse() + str_detect()

samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")

k1 = str_detect(samples,"tumor");k1

ifelse(k1,"tumor","normal")

#这段逻辑不对,会造成 tumor变成了normal

k2 = str_detect(samples,"normal");k2

ifelse(k2,"normal","tumor")

多个条件

两种写法

1,if。。。else

2, ifelse(,,ifelse)在ifelse里加一个ifelse

0
0

补充 case_when

0
0

练习题

1.加载deg.Rdata,根据a、b两列的值,按照以下条件生成向量x:

load("deg.Rdata")

#a< -1 且b<0.05,则x对应的值为down;

#a>1 且b<0.05,则x对应的值为up;

#其他情况,x对应的值为no

k1 = deg$a < -1 & deg$b <0.05;table(k1) #table计算重复值

k2 = deg$a > 1 & deg$b <0.05;table(k2)

x = ifelse(k1,"down",ifelse(k2,"up","no"))

table(x)

小李的case when写法

0
0

循环

让x里的每个元素i都进行代码操作

0
0

i是一个代称

#批量画图

par(mfrow = c(2,2)),把图按照(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)

}

玩转隐式循环

apply

0
0

向量里有两个东西,一个是正文,一个是名字,虽然是向量,但他的每个 元素可以拥有名字

test<- iris[1:6,1:4] apply(test, 2, mean) Sepal.Length Sepal.Width Petal.Length Petal.Width 4.9500000 3.3833333 1.4500000 0.2333333 apply(test, 1, sum) 1 2 3 4 5 6 10.2 9.5 9.4 9.4 10.2 11.4

思考题:如何挑出30个数里最大的5个

0
0

head 取头几个

tail 取尾巴的几个

还没做思考题:如何跳出一个表达矩阵里方差最大的1000个基因

0
0

思考题:取出大于1的所有行

0
0

向量/列表的隐式循环-lapply

lapply(list, FUN, …)

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

lapply(1:4,rnorm)

两个数据框的链接

merge可以合并

inner_join:交集

都存在的取

inner_join(test1,test2,by="name")

full_join:全连接

full_join(test1,test2,by="name")

left_join:左连接,以左边的为准

left_join(test1,test2,by="name")

right_join:右连接,以右边的为准

right_join(test1,test2,by="name")

表达矩阵画箱线图

当x和y没有名字可以简写表达清楚的时候,不是ggplot2可以接受的类型

1. 这是一个矩阵

0
0

2. 先转置

0
0

3. 把行名变成一列

4. “宽”变成“长”

0
0

把格式变成类似于 ggplot2的形式,一列作为x,一列作为y

5. 再ggplot2

实施

set.seed(10086) #随机种子

exp = matrix(rnorm(18),ncol = 6) #随机18个数,分成6列

exp = round(exp,2) #四舍五入,留下小数点后2位

rownames(exp) = paste0("gene",1:3)

colnames(exp) = paste0("test",1:6)

exp[,1:3] = exp[,1:3]+1 # 1-3列的数字在数值上加1

exp

数据框如下

0
0

library(tidyr)

library(tibble)

library(dplyr)

dat = t(exp) %>% # 赋值dat,然后进行转置

as.data.frame() %>% # 矩阵变成数据框

rownames_to_column() %>% #把行名变成一列

mutate(group = rep(c("control","treat"),each = 3)) #新增一列group

0
0

宽变长的方法:

pdat = dat%>%

pivot_longer(cols = starts_with("gene"), #要把gene 1,2,3这一行变成列

names_to = "gene",#命名为gene

values_to = "count")#数值用count表示

0
0

library(ggplot2)

p = ggplot(pdat,aes(gene,count))+

geom_boxplot(aes(fill = group))+

theme_bw()

p

0
0

一些其他函数

1.match-----

load("matchtest.Rdata")

x

y

如何把y的列名正确替换为x里面的ID?

(1)分步解法

a = colnames(y)

b = x$file_name

k = match(a,b);k

#match(a,b)的意思是a里的每个元素在b的第几个位置上。

#是b的下标,可以给b取子集,也可以给与b对应的其他向量取子集。

colnames(y) = x$ID[k]

(2)一步解法

load("matchtest.Rdata")

colnames(y) = x$ID[match(colnames(y),x$file_name)]

(3)放弃match的解法

load("matchtest.Rdata")

rownames(x) = x$file_name

x = x[colnames(y),]

colnames(y) = x$ID

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

dir() # 列出工作目录下的文件

dir(pattern = ".R$") #列出工作目录下以.R结尾的文件

file.create("douhua.txt") #用代码创建文件

file.exists("douhua.txt") #某文件在工作目录下是否存在

file.remove("douhua.txt") #用代码删除文件

file.exists("douhua.txt") #删掉了就不存在啦

可以批量的新建和删除

f = paste0("douhua",1:100,".txt")

file.create(f)

file.remove(f)

重要的函数

0
0

多脚本的管理

0
0

便于方面管理的文件夹

save(赋值各个文件名,file = "xxxx.Rdata/Rdata")

0
0
0
0

../ 读取上一级文件夹

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档