没想到已经完成一周了,内容逐渐从单打独斗到了进阶的内容,gan ba dei!
#准备工作
rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)
x <- "The birch canoe slid on the smooth planks.";x
str_length(x) #注意包括空格,空格也算一个
#[1] 42
length(x) #算的是向量有多少个元素
#[1] 1
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"
str_sub(x,5,9)
#[1] "birch"
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
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."
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."
#一些准备工作,做一个示例数据
test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL # 去掉行名,NULL是“什么都没有”
test
library(dplyr)
a=arrange(test, Sepal.Length) #从小到大
b=arrange(test, desc(Sepal.Length)) #从大到小
#这个函数写列名不加引号,可以先写上数据集名称然后tab出列名,再删去数据框名字,防止写错
identical(a$Sepal.Length,test$Sepal.Length)
#这个函数意思为是否相同,可以用来检查是不是真的排序了
distinct(test,Species,.keep_all = T)
#默认保留第一个
#不加.keep_all = T就只剩Species这列了
mutate(test, new = Sepal.Length * Sepal.Width)
#没赋值的情况下数据实际是不会新增的
#新增列名为new,值为Sepal.Length * Sepal.Width的一列
#原始代码
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()
#默认把管道符%>%前面的数据传送到后面函数的第一个参数位置上,第二个参数前面不需要写逗号
碎碎念:这个东西每次好久不用就想不起格式要重新查,脑子是个好东西,就是漏的厉害
rm(list=ls())
#if的格式
if (){ #if后面的括号里只能是一个逻辑值,不可以是多个逻辑值组成的向量
}
#if+else的格式
if (){
}else{
}
#ifelse的格式
ifelse( , ,) #第一个逗号前是逻辑值
#for的格式
for(){
}
#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)
}
library(dplyr)
i = 0
ifelse(i>0,"+",ifelse(i<0,"-","0"))
case_when(i>0 ~ "+",
i<0 ~ "-",
T ~ "0")
碎碎念:这个玩意儿是真好用,但是学了很多遍还是不进脑子
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
碎碎念:这个没啥好仔细展示的,含义也很直观,主要是要记住有这个函数,等需要用的时候回来找
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")
碎碎念:这个挺绝的,代码把这类数据的变换都涵盖了,适合自己跑一遍体会代码的美丽
# 表达矩阵
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
#方法1:设为行名,看报不报错
rownames(iris)=iris[,1]
#方法2:duplicated
table(duplicated(iris[,1]))
#方法3:unique
length(unique(:iris[,1]))
unique(iris[,1])==iris[,1] #这是用unique的第2种方法
iris$Species[iris$Species=='']=NA
#这里示例数据中,a$tumor_stage.diagnoses内的数据可能的值有stage i、stage iib、stage iva等,只想保留分期信息
str_remove_all(a$tumor_stage.diagnoses,'stage |a|b')
1.可以用if(F){}来进行长脚本的管理,带有{}的代码,可以被折叠
2.分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空再加载,不推荐表格文件
生信技能树,生信马拉松
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。