R语言学习笔记-Day6

2024-07-08 23:13:22 浏览数 (2)

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() #保留右表主要信息

引用自生信技能树

0 人点赞