前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生信马拉松 Day7

生信马拉松 Day7

原创
作者头像
阿呆的月历
修改2024-01-17 19:43:40
2210
修改2024-01-17 19:43:40
举报
文章被收录于专栏:生信马拉松生信马拉松

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

生信技能树,生信马拉松

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Tidyverse Day!(一直都没记住大佬写的包总集到底是哪个,每次都把想起来的包名全加载一遍)
  • 1.字符串处理函数
    • 1.1 检测字符串长度
      • 1.2 字符串拆分
        • 1.3 按位置提取字符串
          • 1.4 字符检测
            • 1.5 字符串替换
            • 1.6 字符删除
            • 2.1 arrange(),数据框按照某一列排序
            • 2.2 distinct,数据框按照某一列去重复
            • 2.3 mutate,数据框新增一列
            • 2.4 管道符
        • 2.数据框相关的处理
        • 3. 条件和循环,if,for
          • 条件和循环的应用
            • 一个类似的函数case_when()
        • 4.隐式循环
        • 5.join()系列函数,两个数据框的连接
        • 6.表达矩阵画箱线图
        • TIPS
          • 1.如何看某一列是否有重复值
            • 2.如何把数据框某列的“ ”转换为NA
              • 3.如何删除多余的信息
                • 4.如何进行长脚本的管理
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档