没想到已经完成一周了,内容逐渐从单打独斗到了进阶的内容,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,下一个脚本开头清空再加载,不推荐表格文件
生信技能树,生信马拉松