生信马拉松 Day7

2024-01-17 19:43:40 浏览数 (2)

没想到已经完成一周了,内容逐渐从单打独斗到了进阶的内容,gan ba dei!

Tidyverse Day!(一直都没记住大佬写的包总集到底是哪个,每次都把想起来的包名全加载一遍)

1.字符串处理函数

代码语言:R复制
#准备工作
rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)
x <- "The birch canoe slid on the smooth planks.";x

1.1 检测字符串长度

代码语言:R复制
str_length(x) #注意包括空格,空格也算一个
#[1] 42
length(x) #算的是向量有多少个元素
#[1] 1

1.2 字符串拆分

代码语言:R复制
str_split(x," ")  #按照“ ”空格拆分,得到一个list
#[[1]]
#[1] "The"     "birch"   "canoe"   "slid"    "on"      "the"    "smooth"  "planks."
x2 = str_split(x," ")[[1]];x2  #加上[[]]得到向量
#[1] "The"     "birch"   "canoe"   "slid"    "on"      "the"    "smooth"  "planks."
y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ") 
str_split(y," ",simplify = T) #list到matrix,所以simplify这个参数必不可少
#     [,1]     [,2] 
#[1,] "jimmy"  "150"
#[2,] "nicker" "140"
#[3,] "tony"   "152"

1.3 按位置提取字符串

代码语言:R复制
str_sub(x,5,9)
#[1] "birch"

1.4 字符检测

代码语言:R复制
str_detect(x2,"h")
#[1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE
str_starts(x2,"T")
#[1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
str_ends(x2,"e")
#[1]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE

1.5 字符串替换

代码语言:R复制
x2
#[1] "The"     "birch"   "canoe"   "slid"    "on"      "the"     "smooth"  "planks."
str_replace(x2,"o","A") #此时只有每个字符串的第一个"o"被替换了
#[1] "The"     "birch"   "canAe"   "slid"    "An"      "the"     "smAoth"  "planks."
str_replace_all(x2,"o","A") #此时全部的“o”都被替换
#[1] "The"     "birch"   "canAe"   "slid"    "An"      "the"     "smAAth"  "planks."

1.6 字符删除

代码语言:R复制
x
#[1] "The birch canoe slid on the smooth planks."
str_remove(x," ")
#[1] "Thebirch canoe slid on the smooth planks."
str_remove_all(x," ") #规律同5
#[1] "Thebirchcanoeslidonthesmoothplanks."

2.数据框相关的处理

代码语言:R复制
#一些准备工作,做一个示例数据
test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL # 去掉行名,NULL是“什么都没有”
test

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

代码语言:R复制
library(dplyr)
a=arrange(test, Sepal.Length) #从小到大
b=arrange(test, desc(Sepal.Length)) #从大到小
#这个函数写列名不加引号,可以先写上数据集名称然后tab出列名,再删去数据框名字,防止写错
identical(a$Sepal.Length,test$Sepal.Length) 
#这个函数意思为是否相同,可以用来检查是不是真的排序了

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

代码语言:R复制
distinct(test,Species,.keep_all = T) 
#默认保留第一个
#不加.keep_all = T就只剩Species这列了

2.3 mutate,数据框新增一列

代码语言:R复制
mutate(test, new = Sepal.Length * Sepal.Width) 
#没赋值的情况下数据实际是不会新增的
#新增列名为new,值为Sepal.Length * Sepal.Width的一列

2.4 管道符

代码语言:R复制
#原始代码
x1 = select(iris,-5) #选择除了第5列的iris数据集
x2 = as.matrix(x1) #转matrix
x3 = head(x2,50) #只要前50行
pheatmap::pheatmap(x3) #画热图

#使用管道符%>%的代码
iris %>%
  select(-5) %>%
  as.matrix() %>%
  head(50) %>% 
  pheatmap::pheatmap()
#默认把管道符%>%前面的数据传送到后面函数的第一个参数位置上,第二个参数前面不需要写逗号

3. 条件和循环,if,for

碎碎念:这个东西每次好久不用就想不起格式要重新查,脑子是个好东西,就是漏的厉害

代码语言:R复制
rm(list=ls())
#if的格式
if (){    #if后面的括号里只能是一个逻辑值,不可以是多个逻辑值组成的向量
}
#if else的格式
if (){
}else{
}
#ifelse的格式
ifelse(   , ,)  #第一个逗号前是逻辑值
#for的格式
for(){  
}

条件和循环的应用

代码语言:R复制
#1.ifelse() str_detect(),王炸组合,用来做grouplist
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
ifelse(k1,"tumor","normal")  #学习一下这个美观写法,改起来也方便
#[1] "tumor"  "tumor"  "tumor"  "normal" "normal" "normal"
k2 = str_detect(samples,"normal");k2
ifelse(k2,"normal","tumor")
#[1] "tumor"  "tumor"  "tumor"  "normal" "normal" "normal"

#2.批量画图
par(mfrow = c(2,2))
for(i in 1:4){
  plot(iris[,i],col = iris[,5])
}

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

一个类似的函数case_when()

代码语言:R复制
library(dplyr)
i = 0
ifelse(i>0," ",ifelse(i<0,"-","0"))
case_when(i>0 ~ " ",
          i<0 ~ "-",
          T ~ "0")

4.隐式循环

碎碎念:这个玩意儿是真好用,但是学了很多遍还是不进脑子

代码语言:R复制
rm(list = ls())
# 1.apply 处理矩阵或数据框
apply(X, MARGIN, FUN, …) 
#其中X是数据框/矩阵名;
#MARGIN为1表示行,为2表示列,FUN是函数

test<- iris[1:6,1:4]

apply(test, 2, mean) #对列操作,得到有names的向量
#Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#   4.9500000    3.3833333    1.4500000    0.2333333 
apply(test, 1, sum)

### 2.lapply(list, FUN, …) 
# 对列表/向量中的每个元素实施相同的操作

lapply(1:4,rnorm) 
#=rnorm(1),rnom(2),rnorm(3),rnom(4),得到一个分别是1/2/3/4个元素的list

5.join()系列函数,两个数据框的连接

碎碎念:这个没啥好仔细展示的,含义也很直观,主要是要记住有这个函数,等需要用的时候回来找

代码语言:R复制
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")

6.表达矩阵画箱线图

碎碎念:这个挺绝的,代码把这类数据的变换都涵盖了,适合自己跑一遍体会代码的美丽

代码语言:R复制
# 表达矩阵
set.seed(10086) #产生相同的随机数
exp = matrix(rnorm(18),ncol = 6)  #产生一个6列的matrix
exp = round(exp,2) #保留小数点后几位小数,第二个参数表示保留几位,不写是取整
rownames(exp) = paste0("gene",1:3) #来个行名
colnames(exp) = paste0("test",1:6)  #来个列名
exp[,1:3] = exp[,1:3] 1  #给数据加点不一样
exp

library(tidyr)
library(tibble)
library(dplyr)
dat = t(exp) %>% #转置,得到matrix
  as.data.frame() %>%  #变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")

library(ggplot2)
p = ggplot(pdat,aes(gene,count)) 
  geom_boxplot(aes(fill = group)) 
  theme_bw()
p
得到的图~得到的图~

TIPS

1.如何看某一列是否有重复值

代码语言:R复制
#方法1:设为行名,看报不报错
rownames(iris)=iris[,1]
#方法2:duplicated
table(duplicated(iris[,1]))
#方法3:unique
length(unique(:iris[,1]))
unique(iris[,1])==iris[,1] #这是用unique的第2种方法

2.如何把数据框某列的“ ”转换为NA

代码语言:R复制
iris$Species[iris$Species=='']=NA

3.如何删除多余的信息

代码语言:R复制
#这里示例数据中,a$tumor_stage.diagnoses内的数据可能的值有stage i、stage iib、stage iva等,只想保留分期信息
str_remove_all(a$tumor_stage.diagnoses,'stage |a|b')

4.如何进行长脚本的管理

1.可以用if(F){}来进行长脚本的管理,带有{}的代码,可以被折叠

2.分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空再加载,不推荐表格文件

生信技能树,生信马拉松

0 人点赞