Day1 R語(yǔ)言基礎(chǔ)
數(shù)據(jù)類型
數(shù)值型(右對(duì)齊)、字符型(左對(duì)齊)、邏輯性(NA:存在但未知的東西*NA作為向量值和誰(shuí)在一起就是什么類型)
class( ) 判斷數(shù)據(jù)類型的函數(shù)
比較運(yùn)算的返回結(jié)果是邏輯值:>,<,>=,<=,==,!=
邏輯運(yùn)算:多個(gè)邏輯條件的鏈接? 與&? ,或|? 朵逝,非!
? eg:3<5&>5? ? FALSE? ? ? ? ? ? !(4>5)? ? ? TRUE
數(shù)據(jù)類型的判斷和轉(zhuǎn)換:is族函數(shù)? ? 返回值為邏輯值
? eg:is.numeric( ) 是否為數(shù)值型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? as族函數(shù)? 實(shí)現(xiàn)數(shù)據(jù)類型之間的轉(zhuǎn)換
? eg:as.numeric( ) 將其他數(shù)據(jù)類型轉(zhuǎn)化為數(shù)值型
Day2
數(shù)據(jù)結(jié)構(gòu)(向量,數(shù)據(jù)框翔怎,矩陣,列表)
2.0數(shù)據(jù)框/向量
數(shù)據(jù)框約等于表格杨耙,是R語(yǔ)言內(nèi)部的數(shù)據(jù)不是真實(shí)存在
要求每一列的數(shù)據(jù)類型是統(tǒng)一的
數(shù)據(jù)框單獨(dú)拿出一列是向量赤套,可以視為一個(gè)整體,一個(gè)向量只能由一種數(shù)據(jù)類型珊膜,可以有重復(fù)值
2.1向量的生成
(1)用c( )逐一放在一起
c(1,2,3,4,5)? ? ? ? [1]? 1 2 3 4 5
? ( 2)連續(xù)的數(shù)字用冒號(hào)
1:5? ? ? ? ? ? [1]? 1 2 3 4 5
(3)有重復(fù)的用rep( )容握,有規(guī)律的序列用seq( ),隨機(jī)數(shù)用rnorm( )
rep("x",times=3/each=3)>each 參數(shù)即為每個(gè)重復(fù)的次數(shù)? ? ? ? ? ? [1]? "x" "x" "x"
seq(from=3,to=21,by=3)? ? ? ? [1]? 3 6 9 12 15 18 21
rnorm(n=3)? ? ? ? ? [1]? 生成三個(gè)隨機(jī)數(shù)
(4)通過組合產(chǎn)生更加復(fù)雜的向量
paste0(rep("x",times=3),1:3)? ? [1] "x1" "x2" "x3"? ? ? ? ? ? ? ?
? ? *paste和paste0之間的聯(lián)系:paste0是paste的簡(jiǎn)化版本车柠,paste的默認(rèn)分割符號(hào)是空格剔氏,可以使用sep參數(shù)指定分隔符,paste0是無(wú)縫連接
tips:數(shù)據(jù)類型轉(zhuǎn)換的優(yōu)先順序:字符型>數(shù)值型>邏輯型
在遵守規(guī)則的情況下竹祷,保留最多的信息
2.2對(duì)單個(gè)向量進(jìn)行的操作
(1)賦值
? ? ? ? x <- c(1,3,5,1)? #規(guī)范的賦值符號(hào):<-? 快捷鍵alt+“-”
? ? ? ? x=c(1,3,5,1)? ? #隨意的寫法
? ? ? ? #賦值+輸出一起實(shí)現(xiàn): (x<- c(1,3,5,1))
? ? ? ? #兩句或多句代碼寫在同一行:? x<- c(1,3,5,1);x
(2)簡(jiǎn)單的數(shù)學(xué)計(jì)算
? ? ? ? ? x+1? ? ? log(x)? ? ? ? ? sqrt(x)? ? ? ? ?
(3)根據(jù)某系條件進(jìn)行判斷谈跛,生成邏輯值向量
? ? ? ? ? x<- c(1,3,5,1)
? ? ? ? ? x>3? [1] FALSE FALSE TRUE FALSE
? ? ? ? ? x==3? [1]FALSE TRUE FALSE FALSE
(4)初級(jí)統(tǒng)計(jì)
? ? ? ? ? max(x)? 最大值? ? ? ? ? ? ? ? ? ? ? ? ? ? length(x)? 長(zhǎng)度
? ? ? ? ? min(x)? 最小值? ? ? ? ? ? ? ? ? ? ? ? ? ? unique(x)? 去重復(fù) (第二次到第多次出現(xiàn)則發(fā)生重復(fù),僅保留第一個(gè))
? ? ? ? ? mean(x)? 均值? ? ? ? ? ? ? ? ? ? ? ? ? ? ? duplicated(x)? 判斷是否重復(fù):重復(fù)了就是TRUE 沒有重復(fù)為FALSE
? ? ? ? median(x)? 中位數(shù)? ? ? ? ? ? ? ? ? ? ? ? table(x)? 重復(fù)值統(tǒng)計(jì)
? ? ? ? ? var(x) 方差? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sort(x)? 從小到大排排序sort(x)? [1] 1 1 3 5
? ? ? ? ? sd(x)? 標(biāo)準(zhǔn)差? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sort(x,decreasing=F)? [1] 1 1 3 5
? ? ? ? ? sum(x)? 總和? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sort(x,decreasing=T)? [1] 5 3 1 1
R語(yǔ)言的"默認(rèn)思想"
?+函數(shù)名查幫助文檔
很多函數(shù)都有自己的默認(rèn)參數(shù)
2.3對(duì)兩個(gè)向量的操作
(1)比較運(yùn)算塑陵,生成等長(zhǎng)的邏輯向量
? ? x=c(1感憾,3,5令花,1)
? ? y=c(3阻桅,2,5兼都,6)
? ? x==y? [1] FALSE F T F
(2)數(shù)學(xué)計(jì)算
(3)連接
? ? paste(x,y,sep=",")? ? [1] "1,3" "3,2" "5,5" "1,6"
? ? 當(dāng)兩個(gè)向量長(zhǎng)度不一致鳍刷,發(fā)生循環(huán)補(bǔ)齊(發(fā)生條件:等位運(yùn)算,兩個(gè)向量元素與元素之間一對(duì)一的運(yùn)算俯抖,兩個(gè)向量長(zhǎng)度不相等)
? ? x = c(1输瓜,3,5芬萍,6尤揣,2)
? ? y = c(3,2柬祠,5)
? ? x == y? [1]? F? F T F T
利用循環(huán)補(bǔ)齊簡(jiǎn)化代碼
? paste0(rep("x",3),1:3)? == paste0("x",1:3)
? ? ? ? [1]? "x1"? "x2"? "x3"
(4)交集北戏,并集,差集
? ? ? x = c(1漫蛔,3嗜愈,5旧蛾,1)
? ? ? y = c(3,2蠕嫁,5锨天,6)
? ? ? 交集 intersect(x,y)? ? [1] 3 5
? ? ? 并集 union(x,y)? ? ? ? ? [1] 1 3 5 2 6
? ? ? 差集 setdiff(x,y)? ? ? ? [1] 1
? ? ? 差集 stediff(y,x)? ? ? ? [1] 2 6
重點(diǎn):%in%(沒有快捷鍵)
? x %in% y? #x的每個(gè)元素在y中存在嗎?
[1] FALSE TRUE TRUE FALSE
== ,+-*/ ,paste paste0 是等位運(yùn)算剃毒,循環(huán)補(bǔ)齊
2.4向量篩選(取子集)
對(duì)象[ 條件 ]:將TRUE對(duì)應(yīng)的值挑選出來(lái)病袄,F(xiàn)ALSE丟棄
(1)邏輯值取子集:eg:x=c(8,9,10,11,12)
? ? ? ? x==10
? ? ? [1] FALSE FALSE TRUE FALSE FALSE
? ? ? x[x==10]
(2)下標(biāo)位置取子集:eg:x=c(8,9,10,11,12)
? ? ? ? ? x[4] #取下標(biāo)為4的數(shù)? ==》11
? ? ? ? x[2:4]#取下標(biāo)為2到4的數(shù) ==》9 10 11
? ? ? ? x[-4]#去掉第四個(gè)下標(biāo)為4的數(shù)
2.5修改向量中的某個(gè)/某些元素:取子集+賦值
R語(yǔ)言內(nèi)的所有修改都需要經(jīng)過賦值,沒有賦值就沒有發(fā)生過
eg:x = x[x ==10]
以上為賦值操作
x? ? [1]? 8? 9? 10? 11? 12
(1)改一個(gè)元素
? x[4] <-? 40? ? ? ? [1] 8? 9? 10? 40? 12? ? *負(fù)號(hào)不能和<一起容易出錯(cuò)
(2)改多個(gè)元素
x[c(1,5)] <- c(80,20)? ? ? [1] 80? 9? 10? 40? 20
2.6簡(jiǎn)單向量作圖
eg:k1 = rnorm(12) ;12
? ? ? ? plot(k1) #簡(jiǎn)單做圖赘阀,橫坐標(biāo)為下標(biāo)益缠,縱坐標(biāo)為k1
eg:k2 = rep(c("a","b","c","d"),each=3) ;k2
? ? ? ? boxplot(k1~k2)? #箱線圖:k1為縱坐標(biāo),k2為橫坐標(biāo)
Day3 數(shù)據(jù)框基公,矩陣和列表
一維:向量vector
二維”表格“:矩陣matrix 是允許一種數(shù)據(jù)類型(常用的是數(shù)值型)
? ? ? ? ? ? ? ? ? ? ? 數(shù)據(jù)框data.frame每列只允許一種數(shù)據(jù)類型幅慌,列與列之間沒有限制
列表list可裝萬(wàn)物
數(shù)據(jù)框
3.1數(shù)據(jù)框來(lái)源
(1)用代碼新建
(2)由已有數(shù)據(jù)轉(zhuǎn)換或處理得到
(3)表格文件的讀取
(4)R語(yǔ)言的內(nèi)置數(shù)據(jù)
*View(volcano)可以看火山圖的內(nèi)部數(shù)據(jù)
3.2新建數(shù)據(jù)框
df1 <- data.frame(gene? ? =paste0("gene",1:4),
? ^? ? ? ? ? ? ? ? ? ? ? ? ? ? change=rep(c("up","down"),eanch-2),
? |? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? score? =c(5,3,-2,-4))
這個(gè)是變量名,不起決定作用
列名和列的內(nèi)容轰豆,列與列之間需要用逗號(hào)隔開
文件的讀惹烦铡:df2 <- read.csv("gene.csv")
3.3數(shù)據(jù)框的屬性
dim(df1)#返回df1的行數(shù)和列數(shù)
nrow(df1)? #返回他的行數(shù)
ncol(df1)? ? #返回他的列數(shù)
rownames(df1)? #返回行名,不允許有重復(fù)值
colnames(df1)? #返回列名
3.4數(shù)據(jù)框的取子集
提取列:df1$score
按坐標(biāo)
df1[2,2]? 一個(gè)單獨(dú)的數(shù)據(jù)df1[2,]? 第二行df1[,2]? 第二列df1[c(1,3),1:2]? 取第一行和第三行秒咨,第一列和第二列
解決報(bào)錯(cuò)的思維:
1.對(duì)比成功的代碼喇辽,數(shù)據(jù)與報(bào)錯(cuò)的代碼,數(shù)據(jù)之間的差別
2.讀懂error后面的字
按名字(可以實(shí)現(xiàn)一下取多列)
df1[,"gene"]? 按列名df1[,c('gene','change')]
按條件(邏輯值)
df1[df1$score>0,]
如何提取數(shù)據(jù)框的最后一列:df1[,ncol(df1)]
如何提取數(shù)據(jù)框除了最后一列以外的其他列:df1[,-ncol(df1)]
3.5數(shù)據(jù)框修改
#改一個(gè)格df1[3,3] <- 5df1#改一整列df1$score <- c(12,23,50,2)? df1
#新增一列df1$p.value <- c(0.01,0.02,0.07,0.05) df1
#改行名和列名rownames(df1) <- c("r1","r2","r3","r4")#只修改某一行/列的名colnames(df1)[2] <- "CHANGE"
3.6兩個(gè)數(shù)據(jù)框的連接
merge(test1,test2,by="name") name表示共同列的列名
merge(test1,test2,by.x=" ",by.y=" ")表示相同數(shù)據(jù)內(nèi)容不同列名的兩個(gè)表格的連接
利用R包中的dplyr的inner_join()函數(shù)也可以實(shí)現(xiàn)數(shù)據(jù)框的連接:x2=inner_join(dat,ids,by = "probe_id")
區(qū)別:inner是取交集的雨席,merge寫參數(shù)后可以有別的用處
3.7數(shù)據(jù)框按照邏輯值取子集
##按條件(邏輯值)
df1[df1$score>0,]
按行進(jìn)行取子集
矩陣
3.1矩陣新建和取子集
m <- matrix(1:9, nrow = 3)? #1-9組成矩陣菩咨,排除三行m[2,]? m[1,2] m[,1] m[2:3,1:2] #取子集
3.2矩陣的轉(zhuǎn)置和轉(zhuǎn)換
colnames(m) <- c("a","b","c") #加列名
#轉(zhuǎn)置:行變列,列變行 t(m)
#轉(zhuǎn)換為數(shù)據(jù)框:as.data.frame(m)
3.3矩陣畫熱圖
> m
? ? a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
pheatmap::pheatmap(m陡厘,cluster_cols=F,cluster_rows=F)
形成聚類樹:相似行和列會(huì)放在一起
列表
3.1列表新建和取子集
#新建
l <- list(m1 = matrix(1:9, nrow = 3),? ? ? ? ? m2 = matrix(2:9, nrow = 2))
l$m1[,1] [,2] [,3][1,]? ? 1? ? 4? ? 7[2,]? ? 2? ? 5? ? 8[3,]? ? 3? ? 6? ? 9
$m2? ? [,1] [,2] [,3] [,4][1,]? ? 2? ? 4? ? 6? ? 8[2,]? ? 3? ? 5? ? 7? ? 9
#取子集抽米,取了第二張表格,第二個(gè)元素
l[[2]]或者l$m2[,1] [,2] [,3] [,4][1,]? ? 2? ? 4? ? 6? ? 8[2,]? ? 3? ? 5? ? 7? ? 9
補(bǔ)充:元素的名字-names()
scores = c(100,59,73,95,45)names(scores) = c("jimmy","nicker","Damon","Sophie","tony")
scores jimmy nicker? Damon Sophie? tony? ? 100? ? 59? ? 73? ? 95? ? 45
scores["jimmy"]jimmy 100 scores[c("jimmy","nicker")] jimmy nicker 100? ? 59 names(scores)[scores>60][1] "jimmy"? "Damon"? "Sophie"
l[2]是list l[[2]]是一個(gè)matrix
刪除變量
刪除一個(gè):rm(l)
刪除多個(gè):rm(df1,m)
刪除全部:rm(list=ls())
清除控制臺(tái):ctrl+l
? Day4 函數(shù)和R包
4.1函數(shù)和參數(shù)
4.1.1形式參數(shù)與實(shí)際參數(shù)
seq(from=3,to=2,by=3)
函數(shù)? 形式參數(shù)糙置,熟練后可以忽略? 實(shí)際參數(shù)
4.1.2寫函數(shù)的函數(shù)
jimmy <- function(a,b,m = 2){? (a+b)^m}
function是創(chuàng)造函數(shù)的函數(shù)
jimmy(1,2)? 9
jimmy(3,6云茸,-2)? 0.01234568
4.2用函數(shù)替代復(fù)制粘貼
jimmy <- function(i){? plot(iris[,i],col=iris[,5])}
jimmy(1)
*當(dāng)代碼需要復(fù)制粘貼三次以上就應(yīng)該寫成循環(huán)或者函數(shù)
4.3默認(rèn)參數(shù)
沒寫的參數(shù)即為用了默認(rèn)值
4.4R包介紹
R包是什么:R包理解為多個(gè)函數(shù)的打包存放,包含數(shù)據(jù)谤饭、函數(shù)标捺、幫助文件和描述文件等。
R包的安裝:基于分析需求按需安裝揉抵。
R包在哪里:CRAN(install.packages())亡容、Bioconductor(BiocManager::install())、GitHub(devtools::install_github())加引號(hào)
R包如何安裝:如上
安裝后需要加載:library() 冤今、 require()一次安裝闺兢,每次打開新的窗口session都需要加載。不加引號(hào)
已經(jīng)安裝的包戏罢,可以用::快速調(diào)用里面的函數(shù) 包名::函數(shù)名? eg:pheatmap::pheatmap(volcano)
4.5R包的使用場(chǎng)景
學(xué)繪圖屋谭,用到ggplot2
(1)快速查看函數(shù)的幫助文檔sd( R包的名字 )
(2)去R包頁(yè)面搜索limma package
(3)browseVignettes運(yùn)行作者寫的網(wǎng)頁(yè)教程脚囊,前提是先加載這個(gè)包
(4)列出一個(gè)包里有哪些函數(shù)或者數(shù)據(jù):ls("package:stringr")
*文件名稱必須帶引號(hào),且在能識(shí)別文件名稱的函數(shù)括號(hào)里桐磁,實(shí)際參數(shù)的位置上
分情況討論
if(!require(stringr))install.packages("stringr")? ? #安裝好了require為TRUE悔耘,安裝失敗為FALSE
Day5 文件讀寫
5.1認(rèn)識(shí)csv格式
getwd()查看工作目錄
tab寫文件名稱
5.1.1 csv的打開方式
(1)默認(rèn)excel,雙擊
(2)用記事本打開
(3)sublime(適用大文件)
(4)R語(yǔ)言讀取所意,對(duì)數(shù)據(jù)框的修改不會(huì)同步到表格文件,數(shù)據(jù)框可以導(dǎo)出文件但不是文件
5.2認(rèn)識(shí)分隔符
常見的分隔符號(hào):逗號(hào)催首、空格扶踊、制表符\t
關(guān)于文件后綴
CSV=Comma Separated Values? 以逗號(hào)為分隔符的文件
TSV=Tab Separated Values? ? 以tab為分隔符的文件
純文本文件的后綴沒有意義,只是約定俗成郎任,起提示作用不起決定作用
5.3將表格文件讀入R語(yǔ)言秧耗,成為數(shù)據(jù)框
read.csv("")? 通常讀取csv格式
read.table("")通常讀取txt格式
#直接讀取失敗就需要指定參數(shù)
*如果想知道文件讀入后是什么數(shù)據(jù)結(jié)構(gòu),應(yīng)該輸入class(test),而不是輸入文件名稱舶治,輸入"ex3.csv"只會(huì)收到character的類型
5.4數(shù)據(jù)框的導(dǎo)出分井,成為表格文件
csv格式:write.csv()
讀取 >>編輯修改 >> 導(dǎo)出(不要覆蓋原文件,讓代碼可重復(fù)霉猛,數(shù)據(jù)可重現(xiàn))
5.5R特有的數(shù)據(jù)保存格式:Rdata
Rdata是文件尺锚,是R語(yǔ)言特有的數(shù)據(jù)存儲(chǔ)格式,保存的是變量惜浅,不是表格文件
save()保存? load() 加載
eg: save(test,file="example.Rdata")
? ? ? load("example.Rdata")
##獲取隔壁文件的Rdata文件
? ? ? (1)load("絕對(duì)路徑")
? ? ? (2)load("相對(duì)路徑")利用tab鍵補(bǔ)齊../
5.6實(shí)戰(zhàn)項(xiàng)目的組織方式
5.6.1歸類:輸出文件瘫辩,輸入文件,輸出圖片坛悉,保存到Rdata伐厌,腳本和Rmd文件,project文件等等
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 工作目錄下的文件夾:? ? ? ? ? ? 文件夾名/文件名
load隔壁文件夾的文件? ../? :上一級(jí)
#1.當(dāng)讀取文件ex1 <-read.table("ex1.txt")發(fā)現(xiàn)列名所在的格式不對(duì)時(shí)裸影,
應(yīng):ex1 <- read.table("ex1.txt",header = T)
#2.當(dāng)輸入命令ex2 <- read.csv("ex2.csv")發(fā)現(xiàn)行名未歸位挣轨,且特殊字符改變?yōu)辄c(diǎn)號(hào),
則ex2 <- read.csv("ex2.csv",row.names = 1,check.names = F)? 設(shè)置行名轩猩,且不要檢查列名
*數(shù)據(jù)框不允許重復(fù)的行名卷扮,解決方法:
1.先不加row.names參數(shù)讀進(jìn)來(lái)
2.處理第一列的重復(fù)值
3.將第一列設(shè)為行名
#3.讀取soft.txt發(fā)生串列
soft <- read.table("soft.txt"),發(fā)現(xiàn)最后一列是空著的因此會(huì)報(bào)錯(cuò)
如果采用soft <- read.table("soft.txt",header = T,fill = T) #其實(shí)不對(duì)均践,會(huì)發(fā)生串列
解決辦法:自行指定分隔符soft2 <- read.table("soft.txt",header = T,sep = "\t")
#4.將soft保存為Rdata并加載画饥。
save(soft,file = "soft.Rdata")rm(list = ls())? 把環(huán)境中的變量清空l(shuí)oad(file = "soft.Rdata")? 把Rdata文件出現(xiàn)在環(huán)境里
要經(jīng)常檢查數(shù)據(jù),查看數(shù)據(jù)類型W腔6陡省!
5.7fread函數(shù)如何使用
library(data.table)? #加載
a = fread("soft.txt",data.table=F)? ? ? ####fread函數(shù)沒有設(shè)置行名的參數(shù)
library(rio)
export(a,file="a.xlsx")
b=list(iris = iris, a = a )
export(b,file = "b.xlsx")
###把列表直接導(dǎo)出來(lái)xlsx
import_list? >>直接讀出列表
Day6作圖
6.1常用可視化R包和函數(shù)
作圖:base ggplot2? ggpubr
拼圖:par里的mfrow? grid.arrange? cowplot? customLayout? patchwork
導(dǎo)出:經(jīng)典三段論? ggsave? eoffice>>topptx
6.2基礎(chǔ)包——繪圖函數(shù)
6.3ggplot2語(yǔ)法
#1.入門級(jí)繪圖模板:作圖數(shù)據(jù)葫慎,橫縱坐標(biāo)
ggplot(data = iris)+? #data放數(shù)據(jù)框? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length))
**ggplot2特殊語(yǔ)法:列名不帶引號(hào)衔彻,行末寫加號(hào)
#2.屬性設(shè)置(顏色薇宠、大小、透明度艰额、點(diǎn)的形狀澄港,線型等)
#2.1 手動(dòng)設(shè)置,需要設(shè)置為有意義的值
ggplot(data = iris) +? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length),? ? ? ? ? ? ? color = "blue")? ? color在geom_point的參數(shù)
ggplot(data = iris) +? geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length),? ? ? ? ? ? ? size = 5,? ? # 點(diǎn)的大小5mm? ? ? ? ? ? alpha = 0.5,? # 透明度 50%? ? ? ? ? ? shape = 8)? # 點(diǎn)的形狀:數(shù)字標(biāo)號(hào)表示
#2.2 映射:按照數(shù)據(jù)框的某一列來(lái)定義圖的某個(gè)屬性ggplot(data = iris)+? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? color = Species))? color屬于aes參數(shù)柄沮,是列名
## 自行指定映射的具體顏色回梧?
ggplot(data = iris)+? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? color = Species))+? scale_color_manual(values = c("blue","grey","red"))? ? ###color和species內(nèi)的種類是配套出現(xiàn)的
scale_shape_manual(values=c( ))
## 區(qū)分color和fill兩個(gè)屬性
Q2-1 空心形狀和實(shí)心形狀都用color設(shè)置顏色
ggplot(data = iris)+? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? color = Species),? ? ? ? ? ? shape = 17) #17號(hào),實(shí)心的例子
ggplot(data = iris)+? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? color = Species),? ##color是管邊框的? ? ? ? ? ? shape = 2) #2號(hào)祖搓,空心的例子
Q2-2 既有邊框又有內(nèi)心的狱意,才需要color和fill兩個(gè)參數(shù)
ggplot(data = iris)+? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? color = Species),? ? ? ? ? ? shape = 24,? ? ? ? ? ? fill = "black") #24號(hào),雙色的例子
#3.分面:把一張圖分成多張子圖
#單分面
ggplot(data = iris) +? geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +? facet_wrap(~ Species)? ##按照species拆分分成spacies個(gè)子圖
#雙分面
dat = iris? #把iris內(nèi)容創(chuàng)給datdat$Group = sample(letters[1:5],150,replace = T)? #新增一列? sample是隨機(jī)抽樣拯欧,樣本數(shù)量比總體大的話要使replace=Tggplot(data = dat) +? geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) +? facet_grid(Group ~ Species)? ##按照group详囤,species兩列分
**文件名只會(huì)出現(xiàn)在將文件導(dǎo)入R語(yǔ)言的那一刻
#4幾何對(duì)象
#幾何對(duì)象可以疊加
局部:僅對(duì)當(dāng)前圖層有效:原代碼:gg
plot(data = iris) +? geom_smooth(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length))+? geom_point(mapping = aes(x = Sepal.Length,? ? ? ? ? ? ? ? ? ? ? ? ? ? y = Petal.Length))
全局:對(duì)所有圖層有效:簡(jiǎn)化后的代碼:ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+? geom_smooth()+? geom_point()
#5統(tǒng)計(jì)變換
統(tǒng)計(jì)變換-直方圖View(diamonds)table(diamonds$cut)
ggplot(data = diamonds) +? geom_bar(mapping = aes(x = cut))? ##y是自己算,數(shù)量? geom bar镐作,條形圖
ggplot(data = diamonds) +? stat_count(mapping = aes(x = cut))? ##statcount 另外一個(gè)角度的畫圖函數(shù)
y=..prop..也可以寫成y=after_stat(prop),group=1是把全部的柱子看做整體計(jì)算它的百分比
#6位置關(guān)系
##6.1抖動(dòng)的點(diǎn)圖ggplot(data = iris,mapping = aes(x = Species,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? y = Sepal.Width,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fill = Species)) +? geom_boxplot()+? geom_point()
ggplot(data = iris,mapping = aes(x = Species,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? y = Sepal.Width,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fill = Species)) +? geom_boxplot()+? geom_jitter()
##堆疊直方圖
ggplot(data = diamonds) +? geom_bar(mapping = aes(x = cut,fill=clarity))? ? ##用兩列
ggplot(data = diamonds) +? geom_bar(mapping = aes(x = cut,fill=clarity),position="dodge")
position="fill"? >>設(shè)成比例
#7坐標(biāo)系
#翻轉(zhuǎn)coord_flip()
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +? geom_boxplot() +? coord_flip()#極坐標(biāo)系coord_polar()bar <- ggplot(data = diamonds) +? geom_bar(? ? mapping = aes(x = cut, fill = cut),? ? width = 1? ) +? theme(aspect.ratio = 1) +? labs(x = NULL, y = NULL)barbar + coord_flip()bar + coord_polar()
完整繪圖模板
ggplot(data=<DATA>)+? ##畫圖數(shù)據(jù)
<GEOM_FUNCATION>##畫圖函數(shù)(mapping=aes(MAPPINGs)##映射,stat=<STAT>##統(tǒng)計(jì)變換時(shí),position=<POSITION>)+? ##位置關(guān)系
<COORDINATE_FUNCTION>+? ###坐標(biāo)系
<FACET_FUNCTION> ###分面
6.3ggpubr? 代碼直接搜
##ggpubr的列名是需要加引號(hào)的
p <- ggboxplot(iris, x = "Species",? ? ? ? ? ? ? ? y = "Sepal.Length",? ? ? ? ? ? ? color = "Species",? ? ? ? ? ? ? ? shape = "Species",? ? ? ? ? ? ? add = "jitter")? ? ? ? ? ? ? ? #畫箱線圖的函數(shù)my_comparisons <- list( c("setosa", "versicolor"),? ? ? ? ? ? ? ? ? ? ? ? c("setosa", "virginica"),? ? ? ? ? ? ? ? ? ? ? ? c("versicolor", "virginica") )? ? ? ? ? #組間比較藏姐,由于本例有很多組價(jià)比較,因此將他們組成一個(gè)列表傳遞給一個(gè)參數(shù)comparisons该贾,等號(hào)前是參數(shù)名稱羔杨,等號(hào)后是參數(shù)的值p + stat_compare_means(comparisons = my_comparisons)+? stat_compare_means(label.y = 9)? ? ? ? ? ## Add pairwise comparisons p-value,把總體比較的p值添加到圖上
6.4圖片的保存
ggplo2系列:ggsave("iris_box_ggpubr.png")
? ? ? ? ? ? ? ? ? ? ? ggsave(p,filename="iris_box_ggpubr2.png")
通用:三段論 (保存的格式及文件名稱:pdf("test.pdf"),作圖代碼,畫完了杨蛋,關(guān)閉畫板(dev.off()))
eg:#1.基礎(chǔ)包作圖的保存pdf("iris_box_ggpubr.pdf")boxplot(iris[,1]~iris[,5])text(6.5,4, labels = 'hello')dev.off()? ? #代碼可運(yùn)行卻不出圖问畅,因?yàn)楫嫲灞徽加枚啻芜\(yùn)行到null device()為止
**eoffice[可以把圖片導(dǎo)出成ppt]:超多點(diǎn)的熱圖不適用,ppt會(huì)卡住
library(eoffice)
topptx(p,"iris_box_ggppubr.pptx")
#拼圖
R包patchwork:支持直接p1+p2拼圖
6.5找現(xiàn)成的代碼
STHDA
1.看別人的圖怎么做的
Day7 R語(yǔ)言綜合運(yùn)用
7.1玩轉(zhuǎn)字符串
加載stringr包:library(stringr)
1.str_length( )
x <- "The birch canoe slid on the smooth planks."
x###1.檢測(cè)字符串長(zhǎng)度str_length(x)? #有多少字符串length(x)? #計(jì)算向量的長(zhǎng)度六荒,即有多少引號(hào)
2.str_split( )字符串拆分
str_split(x," ")? #返回出的結(jié)果是個(gè)列表x2 = str_split(x," ")[[1]];x2
y = c("jimmy 150","nicker 140","tony 152")str_split(y," ")str_split(y," ",simplify = T)
`y = c("jimmy 150","nicker 140","tony 152")? #y是個(gè)長(zhǎng)度為3的向量str_split(y," ")[[1]][1] "jimmy" "150"?
? ? [[2]]? ? [1] "nicker" "140"?
? [[3]]? [1] "tony" "152"
str_split(y," ",simplify = T)? #把數(shù)據(jù)簡(jiǎn)化成矩陣[,1]? ? [,2] [1,] "jimmy"? "150"[2,] "nicker" "140"`[3,] "tony"? "152"``
3.str_sub( )按位置提取字符串
str_sub(x,5,9)? #截取5-9的字符
4.str_detect( )字符檢測(cè)
str_detect(x2,"h")? #返回與x2等長(zhǎng)且一一對(duì)應(yīng)的邏輯值向量护姆,判斷字符串中是否含有關(guān)鍵值
str_starts(x2,"T") #是否以T開頭
str_ends(x2,"e") #是否以e結(jié)尾返回邏輯值
5.字符串的替換
str_replace(x2,"o","A")#把o換成A ,但只替換第一次匹配到的str_replace_all(x2,"o","A")? #把o換成A掏击,所有都替換
6.字符刪除
str_remove(x," ") #只去掉第一個(gè)空格str_remove_all(x," ") #刪除全部的空格
7.大寫變小寫:str_to_lower()
7.2數(shù)據(jù)框排序
加載R包dplyr:library(dplyr)
1.arrange( )
arrange卵皂,更加靈活的排序,默認(rèn)從小到大排序
library(dplyr)arrange(test, Sepal.Length)arrange(test, desc(Sepal.Length))#修改默認(rèn)參數(shù)為按照Sepal.Length從大到小排序arrange(test, desc(Sepal.Width),Sepal.Length)
2.distinc( )去重復(fù)
distinct(test,,Species,.keep_all=T)? #重復(fù)到只出現(xiàn)一次,.keep_all=T即為展示完全列
3.mutate( ):新增一列數(shù)據(jù)框
mutate(test,new=Sepal.Length * Sepal.Width)? #新增一列new的數(shù)據(jù)框砚亭,內(nèi)容是Sepal.Length * Sepal.Width
***但是運(yùn)行該行代碼后灯变,test數(shù)據(jù)仍然不變,因?yàn)闆]有賦值捅膘,沒有賦值就等于沒發(fā)生過
4.order( ) :order 可以給向量排序添祸,也可以給數(shù)據(jù)框排序
sort(test$Sepal.Length)test$Sepal.Length[order(test$Sepal.Length)] #只顯示一列
test[order(test$Sepal.Length),]? #顯示全部,且從小到大test[order(test$Sepal.Length,decreasing = T),] #顯示全部寻仗,且從大到小
5.補(bǔ)充:select( ),filter( )篩選列刃泌,行
6.連續(xù)的步驟
x1=select(iris,-5) #去掉iris的第五列
x2=as.matrix(x1)
x3=head(x2,50)#取x2的前50行
pheatmap::pheatmap(x3)
嵌套方法優(yōu)化代碼:(由里到外寫)
pheatmap::pheatmap(head(as.matrix(select(iris,-5)),50))
管道符 %>%優(yōu)化代碼:將代碼直接往下傳遞? 快捷鍵:crtl+shift+m
優(yōu)點(diǎn):易讀,不產(chǎn)生中間變量
iris%>%
select(-5)%>%
as.matrix()%>%
head(50)%>%
pheatmap::pheatmap( )
優(yōu)秀題目:
3.加載deg.Rdata,根據(jù)a、b兩列的值耙替,按照以下條件生成向量x:
#a< -1 且b<0.05,則x對(duì)應(yīng)的值為down亚侠;#a>1 且b<0.05,則x對(duì)應(yīng)的值為up;#其他情況俗扇,x對(duì)應(yīng)的值為no
統(tǒng)計(jì)up硝烂、down、no各重復(fù)了多少次
load("deg.Rdata")k1 = deg$a< -1 & deg$b<0.05;table(k1)k2 = deg$a>1 & deg$b<0.05;table(k2)x = ifelse(k1,"down",ifelse(k2,"up","no"))
7.3條件與循環(huán)
1條件語(yǔ)句
(1)if(一個(gè)邏輯值){ }
只有邏輯值是true才會(huì)運(yùn)行
插播:長(zhǎng)腳本管理方式
1.if(F)铜幽,{...},則{}里的代碼被跳過(保留但不反復(fù)運(yùn)行的代碼)滞谢,反之則會(huì)被運(yùn)行,凡是帶有{}的代碼均可以被折疊
2.分成多個(gè)腳本除抛,每個(gè)腳本最后保存Rdata狮杨,下一個(gè)腳本開頭清空在加載:rm(list=ls())? load("")
(2)if( ){ }else{ }
i =1if (i>0){? print('+')} else {? print("-")}
重點(diǎn):ifelse函數(shù) ifelse(x,yes,no)
x:邏輯值或邏輯值向量
yes:T的返回值;no:F的返回值
ifelse(i>0,"+","-")
x=rnorm(3)ifelse(x>0,"+","-")
ifelse()+str_detect()
samples=c("t1","t2","t3","n1","n2","n3")
k1=str_detect(samples,"t");k1? ? [1] T T T F F F
ifelse(k1,"t","n")? ? [1]? "t" "t" "t" "n" "n" "n"
(3)多個(gè)條件
i = 0if (i>0){? print('+')} else if (i==0) {? print('0')} else if (i< 0){? print('-')}
ifelse(i>0,"+",ifelse(i<0,"-","0"))
2for循環(huán)
對(duì)x里的每個(gè)元素i進(jìn)行同一操作:for(i in x){CODE}
批量作圖
par(mfrow=c(2,2)) #把畫板分成兩行兩列
for(i in 1:4){plot(iris[,1],col=iris[,5])}
批量裝包
pks=c("tidyr","dplyr",'stringr")? #pks就是一個(gè)普通向量
for(g in pks){
if(!require(g,character.only =T))#避免歧義镶殷,識(shí)別包里的內(nèi)容
install.packages(g,ask=F,update=F)}
7.4隱式循環(huán)
矩陣/數(shù)據(jù)框的隱式循環(huán)——apply禾酱,返回結(jié)果是向量
apply(X,MARGIN,FUN...)
X是矩陣/數(shù)據(jù)框名字
MARGIN為1表示行微酬,為2表示列
FUN是函數(shù)
對(duì)X的每一行/列進(jìn)行FUN這個(gè)函數(shù)
批量畫圖
par(mfrow=c(2,2))
apply(iris[,1:4],2,plot,col=iris[,5])? ##如果有寫不下的參數(shù)绘趋,繼續(xù)寫在apply的括號(hào)里
三種方法:
1:load("test2.Rdata")m=apply(test, 1, var)names=tail(sort(m),1000)
2:load("test2.Rdata")
a=names(tail(sort(apply(test,1,var)),1000))3:b=test%>%? apply(1,var)%>%? sort()%>%? tail(1000)%>%? names()
identical(a,b)
向量/列表的隱式循環(huán)——lapply
lapply(list,FUN,...) #對(duì)列表、向量中的每個(gè)元素實(shí)施相同的操作
#返回值是列表颗管,對(duì)列表中的每個(gè)元素(向量)求均值(試試方差var,分位數(shù)quantile)
lapply(test,mean)lapply(test,fivenum)
lapply(1:4,rnorm)? #1234分別進(jìn)行rnorm
批量畫圖
lapply(1:4,function(i)){
plot(iris[,i],col=iris[,5])}
批量裝包
pks=c("tidyr","dplyr",'stringr")`? #pks就是一個(gè)普通向量
qa=function(g{
if(!require(g,character.only =T))`#避免歧義陷遮,識(shí)別包里的內(nèi)容
? ? `install.packages(g,ask=F,update=F)}
lapply(pks,qa)
7.5數(shù)據(jù)框的連接
##inner_join:取交集
##left_join:左連接
##right_join:右連接
##full_join:全連接
7.6表達(dá)矩陣畫箱線圖
將表達(dá)矩陣改成數(shù)據(jù)框——轉(zhuǎn)置
把行名變成新數(shù)據(jù)的一列
寬變長(zhǎng)
表達(dá)矩陣
set.seed(10086)? #抽到的一組隨機(jī)數(shù)字,讓隨機(jī)的成果變得可以固定下來(lái)
exp = matrix(rnorm(18),ncol = 6)? #把這十八個(gè)數(shù)字排列成六列
exp = round(exp,2)? # 四舍五入垦江,保留小數(shù)點(diǎn)后兩位rownames(exp) = paste0("gene",1:3)? #給表達(dá)矩陣加行名colnames(exp) = paste0("test",1:6)? #給表達(dá)矩陣加列名exp[,1:3] = exp[,1:3]+1? #讓前三列和后三列有區(qū)別帽馋,得到前三列比后三列大的表達(dá)矩陣exp
library(tidyr)library(tibble)library(dplyr)dat = t(exp) %>%? #轉(zhuǎn)置? as.data.frame() %>%? #變數(shù)據(jù)框? rownames_to_column() %>%? #行名變成一列? mutate(group = rep(c("control","treat"),each = 3))? #在dat上新增一列名為group,內(nèi)容為3個(gè)control和3個(gè)treat
pdat = dat%>% #處理表達(dá)矩陣? pivot_longer(cols = starts_with("gene"), #寬變長(zhǎng)比吭,把列給合并绽族,給予列名,原本寬下的數(shù)字變成一列叫count? ? ? ? ? ? ? names_to = "gene",? ? ? ? ? ? ? values_to = "count")
library(ggplot2)p = ggplot(pdat,aes(gene,count))+? geom_boxplot(aes(fill = group))+? theme_bw()pp + facet_wrap(~gene,scales = "free")? #分面:三個(gè)基因分成三張子圖
一些頂呱呱的函數(shù)
match()? #用于在向量中查找某個(gè)值衩藤,并返回該值在向量中第一次出現(xiàn)的位置吧慢。
dir()? #用于列出指定目錄中的文件和子目錄的名稱。
file.create()? #用于創(chuàng)建一個(gè)或多個(gè)空文件赏表。
file.exists()? #用于檢查指定的文件是否存在检诗。
file.remove()? #用于刪除指定的文件。
重點(diǎn)