玩转字符串与数据框

生信过程中,字符串与数据框的处理非常常见。处理字符串,不得不需要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

引用自生信技能树

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值