R语言的综合应用
tidyverse:集成化R包
转换-可视化-模型
1 字符串
"stringr"
str_length() str_split() str_sub()
1.1 检测字符串长度
str.length() 计算一个"字符串"内的字符数。# 空格和标点也会被计入字符数
1.2 字符串的拆分
x <- "The birch canoe slid on the smooth planks." str_split(x," ") 根据字符串内" "(空格)进行拆分
class(str_split(x," ")) 1 "list" #获得向量:[1] #str_split()可对多个字符串进行拆分,每个字符串成为一个数据框,因而成为一个列表
简化:列表->矩阵
str_split(x," ",simplify = T) x2 <- str_split(x," ")[1] #输出结果同上
#按照多个标准进行拆分:
str_split(x," |,") #按" "或","进行拆分
1.3 按位置提取字符
str_sub(x,5,9) 1 "birch" #提取第5到第9个字符
1.4 字符检测
str_detect(x2,"h") 对每个字符串内的字符进行检测,是否存在该字符(输出值为T或F)
1.5 字符的替换
str_replace(x2,"o","A") 只会对第一次出现的"o"替换成"A" #改进: str_replace_all(x2,"o","A") 对所有的"o"替换成"A"
1.6 字符删除
str_remove(x,"o") 只会对第一次出现的"o"进行删除 #改进: str_remove_all(x,"o") 对所有的"o"进行删除
1.7 补充
y = c("jimmy 150","nicker 140","tony 152") #只要人名 str_split(y," ",simplify = T),1 #去除" "和数字 str_remove_all(y," |d")#正则表达式"d"代表数字
1.8 大小写转换
tolower(<stringer>) #字符串内全部字母转换为小写
2 数据框
2.1 排序
arrange(test,Sepal.Length) #按照某一列对整个数据框进行排序。#整行移动 #升序排序 降序排序 arrange(test,desc(Sepal.Length)) ##列名不能加""
2.2 去重复
distinct(test,Species,.keep_all=T) #对某一列中重复的元素去重复,仅保留首次出现的元素
2.3 新增列
mutate(test, new = Sepal.Length Sepal.Width) #未赋值则数据框的列数不发生变化 或: test$new = test$Sepal.Length test$Sepal.Width #该语句运行完数据框列数即增加无需赋值
2.4 筛选列、行
select() #筛选列 filter() #筛选行
2.5 管道符号
x1 = select(iris,-5) #反选,筛选除第5列外的数据 x2 = as.matrix(x1) x3 = head(x2,50) #截取前端行(前50行) heatmap(x3) -->嵌套 heatmap(head(as.matrix(select(iris,-5)),50)) -->管道符号“%>%” iris %>% select(-5) %>% as.matrix() %>% head(50) %>% heatmap() 将上一步的数据向下传递 #管道符号快捷键“Ctrl” “shift” “M”
3 条件和循环*
3.1 if语句
if(1){ } 1:为一个逻辑值,不能为多个逻辑值组成的向量 #若为T,则继续执行后续语句;若为T,则不继续执行
长脚本管理方式
*1
if(F){...} #{}内所有代码被跳过 if(T){...} #{}内代码执行 #针对限速步骤 可以将限速步骤保存为.Rdata,之后加载该文件即可 #下载数据的代码,可保留但不反复运行 *2 分成多个脚本,每个脚本最后保存.Rdata,下一个脚本开头清空再加载
为什么保存为.Rdata而不是表格文件
*1 变量,自带变量名称,无需赋值,没有参数
*2 表格文件需要赋值,参数影响读取结果,不能在后续文件同等处理
*3 可保存多个变量
*4 可保存任意数据结构
if(2){ code1 }else{ code2 } 2:若逻辑值为TRUE,则执行code1,反之执行code2
多个条件仍适用
if(){ code1 }else if(){ code2 }else{ code3 }
3.2 ifelse函数
仅有三个参数
ifelse(x,yes,no) #x:逻辑值或逻辑值向量 #yes:逻辑值为T时的返回值 #no:逻辑值为F时的返回值 i = 1 ifelse(i>0," ","-") 1 " " 多个条件仍适用 ifelse(i>0," ",ifelse(i<0,"-","0"))
3.3 ifelse() str_detect()
应用示例:
sample = c("tumor1","tumor2","tumor3","normal1","normal2","normal3") k1 = str_detect(sample,"tumor") ifelse(k1,"tumor","normal") k2 = str_detect(sample,"normal") ifelse(!k2,"tumor","normal")
3.4 for循环
for(i in x){ CODE } #对x中的每个元素i执行相同的代码CODE #有几个元素则执行几次,函数本身不存在判断条件,可自行添加其它函数进行判断
e.g.1
for(i in 1:4){
- print(i)
- } 1 1 1 2 1 3 1 4 e.g.2
par(mfrow = c(2,2)) for(i in 1:4){
- plot(iris,i,col = iris,5)
- }
批量装包
pks = c("tidyr","dplyr","stringr") for(g in pks){
- if(!require(g,character.only = T))
- install.packages(g,ask = F,update = F) }
4 隐式循环
4.1 矩阵/数据框的隐式循环——apply
apply(X,MARGIN,FUNCTION,...) apply(test,2,mean) #1 X代表数据框/矩阵名 #2 MARGIN以数值作代表,1为行,2为列 #*3 FUNCTION为函数
#如何取出30个随机数中最大的5个数值?
x <- rnorm(30);x tail(sort(x),5)
4.2 向量/列表的隐式循环——lapply
lapply(list,FUNCTION,...) #对列表/向量中每个元素实施相同的操作 e.g. lapply(1:4,rnorm) [1] 1.13
[2]
1 0.78 1.13
[3]
1 1.81 -0.04 -0.17
[4]
1 0.04 1.22 -1.13 0.365
#输出为列表,包含四个向量
5 两个数据框的连接
5.1 交集
inner_join()
取交集
5.2 全连接
full_join() #保留全部主要信息
5.3 左连接
left_join() #保留左表主要信息
5.4 右连接
right_join() #保留右表主要信息
引用自生信技能树