前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言基础提升与总结

R语言基础提升与总结

原创
作者头像
可乐同学与生信死磕到底
发布2024-04-03 21:04:56
1320
发布2024-04-03 21:04:56
举报

从今天起试一试先听课之后再跟着课件整理笔记的方法~

1 玩转字符串——stringr

1.1 str_length 字符串的长度

区分字符型向量/字符串/字符

代码语言:r
复制
y = c("jimmy 150","nicker 140","tony 152")

y:字符型向量

"jimmy 150":字符串,一个引号内的所有东西

引号内的单个字母/数字/符号称为字符

代码语言:r
复制
x <- "The birch canoe slid on the smooth planks."
x
str_length(x)
length(x)

1.2 str_split() 拆分字符串

有分隔符号的拆分

代码语言:r
复制
str_split(x," ")
x2 = str_split(x," ")[[1]];x2
代码语言:r
复制
y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")
str_split(y," ",simplify = T)

simplify = T 简化

1.3 str_sub() 按照位置提取

代码语言:r
复制
str_sub(x,5,9) 

提取x中的第五个——第九个字符

1.4 ?字符检测

返回逻辑值

代码语言:r
复制
str_detect(x2,"h")
str_starts(x2,"T") 
str_ends(x2,"e")

1.5 字符串替换

代码语言:r
复制
x2
str_replace(x2,"o","A") 
str_replace_all(x2,"o","A")

1.6 字符删除

代码语言:r
复制
x
str_remove(x," ")
str_remove_all(x," ")

2 玩转数据框

使用内置数据iris建立新的数据框test

代码语言:r
复制
test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL # 去掉行名,NULL是“什么都没有”
test

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

代码语言:r
复制
library(dplyr)
arrange(test, Sepal.Length) #从小到大
arrange(test, desc(Sepal.Length))

2.2 distinct()按照某一列去重复

代码语言:r
复制
distinct(test,Species,.keep_all = T)
distinct(test,Species)

2.3 mutate()新增一列

代码语言:r
复制
mutate(test, new = Sepal.Length * Sepal.Width)

?只是在控制台上对数据框test进行了一些操作,实际上的test还是只有5列!

没有赋值就没有发生过!

补充:select()筛选列 filter()筛选行

代码语言:r
复制
x1 = filter(iris,Sepal.Width>3)
x2 = select(x1, Sepal.Length,Sepal.Width)
x3 = arrange(x2,Sepal.Length)

x1 x2为中间变量,无其他用途

管道符号:%>%传递,简洁明了

把前一步的运算结果传递给下一步的函数,作为这个函数的第一个参数

代码语言:r
复制
x = iris %>% 
  filter(Sepal.Width>3) %>% 
  select(Sepal.Length,Sepal.Width)%>%
  arrange(Sepal.Length)

3 条件语句和循环语句

这里只介绍if条件语句和for循环语句

看懂代码在干什么即可!

3.1 if条件语句

如果……就……

if(一个逻辑值,不可以是逻辑值组成的向量){ }

TRUE 执行

FALSE 不执行

如果……就……否则……

if(一个逻辑值,不可以是逻辑值组成的向量){ }else{ }

重点 ifelse函数

ifelse(x,yes,no)

x:逻辑值或者逻辑值向量

yes:逻辑值为TRUE时的返回值

no:逻辑值为FALSE时的返回值

ifelse函数支持单个逻辑值,也支持多个逻辑值组成的向量

代码语言:r
复制
x = rnorm(3)
x
ifelse(x>0,"+","-")

ifelse()+str_detect()王炸组合

代码语言:r
复制
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
ifelse(k1,"tumor","normal")
k2 = str_detect(samples,"normal");k2
ifelse(k2,"normal","tumor")

ifelse()可以满足多个条件的嵌套

代码语言:r
复制
i = 0
if (i>0){
  print('+')
} else if (i==0) {
  print('0')
} else if (i< 0){
  print('-')
}

ifelse(i>0,"+",ifelse(i<0,"-","0"))

3.2 for循环语句

3.2.1 对向量中的每一个元素进行循环

对x里的每一个元素i进行同一个操作

for(i in x){ }

代码语言:r
复制
x <- c(5,6,0,3)
s=0
for (i in x){
  s=s+i
  print(c(i,s))
}

3.2.2 第二种循环方式:下标循环

代码语言:r
复制
x <- c(5,6,0,3)
s = 0
for (i in 1:length(x)){
  s=s+x[[i]]
  print(c(x[[i]],s))
}

3.2.3 如何将for循环的结果保存下来?

代码语言:r
复制
m=list()
m[[1]]=iris[1:50,]
m[[2]]=iris[51:100,] #列表新建的另一种方式
m0=list(iris[1:50,],iris[51:100,])
identical(m,m0)

s = 0
result = list()
for(i in 1:length(x)){
  s=s+x[[i]]
  result[[i]] = c(x[[i]],s)
}
result
do.call(cbind,result) #把result的结果简化,按列拼接成为一个矩阵 do.call完成批量操作

4 表达矩阵画箱线图

4.1 表达矩阵的概念

基因表达的数据通常使用表达矩阵来表示

其中矩阵的行代表某个基因在不同样本(不同处理,或时间点等)中的表达水平

列表示某个样本中各个基因的表达水平

4.2 如何把基因和count变为数据框的列名?

  • 转置t
  • 把原来的行名变为第一列
  • 宽数据变长数据 代码实现:set.seed(10086)# 随机种子,让rnorm的结果变固定 exp = matrix(rnorm(18),ncol = 6) exp = round(exp,2)#round取小数点后2位 rownames(exp) = paste0("gene",1:3) colnames(exp) = paste0("test",1:6) exp exp[,1:3] = exp[,1:3]+1 exp
利用代码生成exp表达矩阵数据
利用代码生成exp表达矩阵数据
代码语言:r
复制
#tidyverse系列不认矩阵 矩阵转换为数据框
library(tidyr)
library(tibble)
library(dplyr)
dat = t(exp) %>%  #t()转置
  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")
#使用ggplot画图
library(ggplot2)
p = ggplot(pdat,aes(gene,count))+
  geom_boxplot(aes(fill = group))+ 
  theme_bw()

添加分面

代码语言:r
复制
p + facet_wrap(~gene,scales = "free")

5 隐式循环

5.1 矩阵/数据框的隐式循环——apply

apply(X,MARGIN,FUN…)

X:数据框/矩阵名称

MARGIN:取值=1表示行;取值=2表示列

FUN:具体函数

对X的每一行/每一列进行FUN这个函数

代码语言:r
复制
test<- iris[1:6,1:4]
apply(test, 2, mean)
apply(test, 1, sum)

5.2 列表的隐式循环——lapply 不涉及行和列

代码语言:r
复制
test <- list(x = 36:33,y = 32:35,z = 30:27);test
lapply(test,mean)
lapply(test,fivenum)
代码语言:r
复制
#sapply 简化结果,返回矩阵或向量
sapply(test,mean)
sapply(test,fivenum)
class(sapply(test,fivenum))

6 两个数据框的连接

6.1 inner_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
代码语言:r
复制
library(dplyr)
#五个数据框连接的函数 半连接、反连接基本用不到
inner_join(test1,test2,by="name")
#左连接 左边表里的人都留下 左边说了算
#右连接 右边表里说了算的连接
right_join(test1,test2,by="name")
full_join(test1,test2,by="name")
semi_join(test1,test2,by="name")
anti_join(test1,test2,by="name")

semi_join anti_join实际上没有发生过两个数据框的连接,其实是对左边的数据框取子集

7 一些顶呱呱的函数

7.1 match()

7.2 一些处理文件的函数

代码语言:r
复制
dir() # 列出工作目录下的文件
dir(pattern = ".R$") #列出工作目录下以.R结尾的文件 $表示以……结尾
dir(pattern = ".R") 

file.create("douhua.txt") #用代码创建文件
file.exists("douhua.txt") #某文件在工作目录下是否存在
file.remove("douhua.txt") #用代码删除文件
file.exists("douhua.txt") #删掉了就不存在啦
## 可以批量的新建和删除
f = paste0("douhua",1:100,".txt")
file.create(f)
file.remove(f)

8 思考题:如何挑选出一个表达矩阵里方差最大的基因?

1.计算每个基因的方差(每个基因是每一行,方差var)

2.每个基因方差排列

3.最后1000个数字所对应的基因

代码语言:r
复制
load("test2.Rdata")
##里面保存的数据框名字是test
dim(test)
apply(test, 1, var)
##计算数据框test每一个基因的方差
sort(apply(test, 1, var))
##从小到大排序,最大的1000应在最后面
tail(sort(apply(test, 1, var)),1000)
##用**tail函数**(从后面开始取)取最后1000个方差最大的基因,默认参数是6不写,这里是1000,写上
names(tail(sort(apply(test, 1, var)),1000))
#提取**元素名称**,挑出1000个基因名字

说明:

以上内容是生信技能树小洁老师课程笔记,请结合食用~

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 玩转字符串——stringr
    • 1.1 str_length 字符串的长度
      • 1.2 str_split() 拆分字符串
        • 1.3 str_sub() 按照位置提取
          • 1.4 ?字符检测
            • 1.5 字符串替换
              • 1.6 字符删除
              • 2 玩转数据框
                • 2.1 arrange()数据框按照某一列排序
                  • 2.2 distinct()按照某一列去重复
                    • 2.3 mutate()新增一列
                      • 补充:select()筛选列 filter()筛选行
                      • 3 条件语句和循环语句
                        • 3.1 if条件语句
                          • 重点 ifelse函数
                        • 3.2 for循环语句
                          • 3.2.1 对向量中的每一个元素进行循环
                          • 3.2.2 第二种循环方式:下标循环
                          • 3.2.3 如何将for循环的结果保存下来?
                      • 4 表达矩阵画箱线图
                        • 4.1 表达矩阵的概念
                          • 4.2 如何把基因和count变为数据框的列名?
                          • 5 隐式循环
                            • 5.1 矩阵/数据框的隐式循环——apply
                              • 5.2 列表的隐式循环——lapply 不涉及行和列
                              • 6 两个数据框的连接
                                • 6.1 inner_join 取交集
                                • 7 一些顶呱呱的函数
                                  • 7.1 match()
                                    • 7.2 一些处理文件的函数
                                    • 8 思考题:如何挑选出一个表达矩阵里方差最大的基因?
                                    • 说明:
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                                    http://www.vxiaotou.com