生信过程中,字符串与数据框的处理非常常见。处理字符串,不得不需要stringr包。
if(!require(stringr))install.packages('stringr')
library(stringr)
1.字符串处理
1.1长度
常用2种函数处理字符串数据
str_length(x)
length(x)
即是字符串与字符型向量的区别,如下:
1.2拆分
可见,使用str_split函数拆分字符串得到的是列表,有没有办法直接得到矩阵呢?
y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")
str_split(y," ",simplify = T)#返回一个矩阵
此外还包括其他的处理函数:包括按位置提取,检测,替换,删除
### 3.按位置提取字符串
str_sub(x,5,9)
### 4.字符检测
str_detect(x2,"h")#是否有h
str_starts(x2,"T")#是否以T开头
str_ends(x2,"e")#是否以e结尾
### 5.字符串替换
x2
str_replace(x2,"o","A")
str_replace_all(x2,"o","A")
### 6.字符删除
x
str_remove(x," ")
str_remove_all(x," ")
一些拓展:
a=read.delim("../生信技能数教程/DAY3-4/R_02/GSE217012_Normalized_RPKM_LOG2_matrix.txt.gz")#../表示上一级,也可用绝对路径
str_starts(a$QSeq.ID,"Z-")%>% table() #是否以Z-开头,传递给table函数统计
str_split(a$QSeq.ID,"-",simplify = T)[,2]#以“-”为界,提取转化矩阵的第二列
str_sub(a$QSeq.ID,3,8)
#假如 不都8
str_sub(a$QSeq.ID,3,str_length(a$QSeq.ID))
colnames(a)[6:20] %>% #传递
str_remove(" - log2 total RPKM") %>%
#str_remove_all("-|1|2|3")%>%,str_remove内也可|与&
str_remove_all("-|\\d")#\\d表示所有数字
2.数据框的操作使用
2.1排序
我们先生成一个数据框:
test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL # 去掉行名,NULL是“什么都没有”
test
排序需要用到dplyr包中的arrange函数:
# arrange,数据框按照某一列排序
library(dplyr)
arrange(test, Sepal.Length) #从小到大
arrange(test, desc(Sepal.Length)) #从大到小
#arrange("test", Sepal.Length)不报错,要小心
去重:
# distinct,数据框按照某一列去重复
distinct(test,Species,.keep_all = T)
用mutate新增列:
# mutate,数据框新增一列
mutate(test, new = Sepal.Length * Sepal.Width)#要赋值
test$new=test$Sepal.Length * test$Sepal.Width#不用赋值
2.2连续操作
其中,head函数可以取前几行,要记住
3.数据框的连接
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'),
blood_type = c("A","B","O","AB"))
test1
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))
test2
library(dplyr)
inner_join(test1,test2,by="name")#交集,只要两者共有的
left_join(test1,test2,by="name")#以左为主,右边没有的部分丢弃
right_join(test1,test2,by="name")#以右为主,左边没有部分丢弃
full_join(test1,test2,by="name")#全集,全要
4.表达矩阵画箱线图
如果我们采用ggplot2画图,则必须找到xy,而这显然是表达矩阵不具备的(最终目的如右图),因此我们需要对矩阵进行改写。
library(tidyr)
library(tibble)
library(dplyr)
dat = t(exp) %>% #转置
as.data.frame() %>% #变成数据框
rownames_to_column() %>% #第一行变列名
mutate(group = rep(c("control","treat"),each = 3))
pdat = dat%>%
pivot_longer(cols = starts_with("gene"),
names_to = "gene",
values_to = "count")
如何理解其中的管道?
这一步中,后面的代码形成管道,一步一步嵌套运行,最后赋值给dat
实现:
下一步实现:
最后画图:
library(ggplot2)
p = ggplot(pdat,aes(gene,count))+
geom_boxplot(aes(fill = group))+
theme_bw()
p
引用自生信技能树