- 運行腳本的快捷鍵:cmd+enter (mac)
- 工作目錄是指腳本、數據、圖片的默認保存位置,也是文件讀取的默認位置。
我們使用project來管理工作目錄
開始一個新的R語言數據分析新項目,管理腳本、圖片、文件的推薦方式:打開Rstudio,新建Rproject,新建腳本(腳本存放在生成的Rproject文件夾中)。
- 控制臺上的提示符不是'>’而是'+’時,提示命令不完整,解決辦法是將其補齊或者將光標放在控制臺最后一行,按ESC退出。
- 邏輯型向量除了TRUE和FALSE,還有NA。
NA和null的區(qū)別:
NA表示數據集中的該數據遺失、不存在。在針對具有NA的數據集進行函數操作的時候,NA不會被直接剔除。如x<-c(1,2,3,NA,4),取mean(x),返回結果為NA,如果想去除NA的影響,需要額外設置,如 mean(x,na.rm=T)。NA是沒有自己的數據類型(mode/class)的,在vector中,它會“追隨”其他數據的類型,比如剛剛的x,mode(x)為numeric,mode(x[4])則也為numeric
NULL表示未知的狀態(tài)。在運算時不會被計算。如x<-c(1,2,3,NULL,4),取mean(x),結果會返回2.5。NULL是不算數的,length(c(NULL))為0,而length(c(NA))為1??梢奛A“占著”位置,它存在著,而NULL沒有“占著”位置,或者說“不知道”有沒有真正的數據。
- 打開Rproject中的腳本,出現亂碼,可以選擇file--Reopen with Encoding--UTF8來重新打開。
- paste和paste0的區(qū)別:paste/paste0 函數, 用于連接字符(向量),paste 可以設置連接字符,默認以空格作為連接字符;paste0 以空字符串連接字符,不能設置 sep 值。
paste0("gene",1:3)
# [1] "gene1" "gene2" "gene3"
paste("gene",1:3)
# [1] "gene 1" "gene 2" "gene 3" #默認以'空格'分隔
paste("gene",1:3,sep="") #若對paste函數設置sep="",效果和paste0一樣
[1] "gene1" "gene2" "gene3"
- R語言的數據類型是存在優(yōu)先順序的。其順序為:
字符型 > 數值型 > 邏輯型
#一個向量中只允許一種數據類型存在
x=c(1,'a',FALSE)
x
# [1] "1" "a" "FALSE"
class(x[1])
# [1] "character"
class(x[3])
# [1] "character"
y=c(1,FALSE)
y
# [1] 1 0
class(y[2])
# [1] "numeric"
若要逆著優(yōu)先順序操作,將返回NA
as.numeric('tree')
# [1] NA
# Warning message:
# NAs introduced by coercion
- x==y 和 x %in%y 的區(qū)別??
x %in%y是判斷x中的每一個元素是否在y中存在。
若x和y長度不一致,返回x個TRUE或者FALSE。
??練習:按如下方式生成test數據框,提取test中,最后一列值為a或c的行,組成一個新的數據框,賦值給test2。
set.seed(33)
test=data.frame(l=rnorm(15),m=sample(1:100,15),n=sample(c('a','b','c'),15,replace = TRUE))
#正解:
test2=test[test$n%in%c('a','c'),]
#錯誤:
test2=test[test$n==c('a','c'),]
這里如果使用==來判斷,就相當于拿test$n的15個值與c('a','c')的2個值來一一對應著比對,因為兩者長度不同,會發(fā)生循環(huán)補齊,其效果如下圖,明顯不是我們想要的結果。
x%in%y:選出x是y中一個值時的所有行
- x[x %in%y]和intersect(x,y)的區(qū)別
x %in%y只查看,不去重。intersect(x,y)則可以去重。
x = c(1,3,5,1,3)
y = c(3,2,5,6,2)
x[x %in% y ]
# [1] 3 5 3
intersect(x,y)
# [1] 3 5
另:取交集、差集、并集的函數為:intersect(x,y)、union(x,y)、setdiff(x,y)、setdiff(y,x)
- 代碼不換行,用分號分割,和換行效果一樣。
- 對單個向量進行的操作中比較重要的幾個函數:
length() 、unique(x)、duplicated(x)、table(x)、sort(x)
- match函數:向量匹配排序??
y[match(x,y)]:以x作為模板,給y調順序
x <- c("A","B","C","D","E")
y <- c("B","D","E","A","C")
match(x,y)
# [1] 4 1 5 2 3
y[match(x,y)]
# [1] "A" "B" "C" "D" "E"
x[match(y,x)]
# [1] "B" "D" "E" "A" "C"
a <- data.frame(x,y,z=sample(100,5))
a
# x y z
# 1 A B 88
# 2 B D 15
# 3 C E 87
# 4 D A 28
# 5 E C 84
a[match(a$y,a$x),]
# x y z
# 2 B D 15
# 4 D A 28
# 5 E C 84
# 1 A B 88
# 3 C E 87
match函數的用法參考:https://blog.csdn.net/woodcorpse/article/details/84927296
使用match函數修改矩陣的信息
#生成數據框
a=sample(LETTERS[1:24],7)
b=sample(letters[1:24],7)
c=sample(letters[1:24],7)
gene_name=paste0(a,b,c)
df <- data.frame(file_name=sample(1:7,7,replace = F),gene_name=gene_name)
#生成矩陣
matrix=matrix(sample(1:1000,49),nrow=7)
colnames(matrix)=sample(df$file_name,7,replace = F)
#將矩陣matrix的列名 (file_name) 換成樣本名 (gene_name)
colnames(matrix) = df$gene_id[match(colnames(matrix),df$file_name)]
- 列表取子集,使用[]取出的還是列表,是只有一個元素的列表。[[]]取出的才是列表中的元素。
l <- list(m=matrix(1:9, nrow = 3),
df=data.frame(gene = paste0("gene",1:3),
sam = paste0("sample",1:3),
exp = c(32,34,45)),
x=c(1,3,5))
l
# $m
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
# $df
# gene sam exp
# 1 gene1 sample1 32
# 2 gene2 sample2 34
# 3 gene3 sample3 45
# $x
# [1] 1 3 5
l[3]
# $x
# [1] 1 3 5
class(l[3]) #取出的還是列表
# [1] "list"
l[[3]]
# [1] 1 3 5
class(l[[3]]) #取出的是數值型向量
# [1] "numeric"
- 網絡問題經常導致github訪問不了,可以先在github上下載把code下載下來,再選擇install_local()本地安裝
devtools::install_local("AnnoProbe-master.zip",upgrade = F)
- 下載R包有3種方法,CRAN,bioconductor和github。其中CRAN和bioconductor是可以設置鏡像的。
方法1--設置CRAN鏡像:打開R studio,點擊tools--global option--packages,選擇Package CRAN reposotory。
方法2--設置CRAN和bioconductor鏡像
options("repos"=c(CRAN="http://mirrors.tun a.tsinghua.edu.cn/CRAN/"))
options(BioC_mirror="http://tc.e du.cn/bioc/")
- 加載R包除了library()函數還有require()函數
如果安裝了某個包,require()就會返回TRUE,并加載R包。沒安裝就會返回FALSE
if(!require(stringr))install.packages("stringr")
#意思是如果'stringr’包沒有安裝,就安裝'stringr’包。
if(TRUE) #后面的代碼被運行
if(FALSE) #后面的代碼被跳過
- 查看R包的在線教程幫助文檔:
browseVignettes() 函數(browseVignettes不是每個包都有)
browseVignettes("stringr")
- 查看某個R包中有哪些函數
# 以dplyr包為例
library(dplyr)
ls('package:dplyr')
- R語言能讀取的文件格式
用于讀取/導出文件的R包
rio可以不用區(qū)分讀入文件類型,大部分文件可直接用import()讀取。
- @和$的區(qū)別
x$y 等價于 x[["y", exact = FALSE]],用于獲取dataframe或者list里面的某個變量,比如mtcars$cyl 和 diamonds$carat。不同之處在于$可以部分匹配變量名,比如:
x <- list(abc = 1)
x$a
#> [1] 1
x[["a"]]
#> NULL
@ 是R中,S4類的一個操作符,用于提取S4對象中的內容(slot),比如:
setClass("Person",slots = list(name = "character", age = "numeric"))
alice <- new("Person", name = "Alice", age = 40)
alice@age
# [1] 40
這個時候$是不起作用的,因為被S4類重寫了??梢宰约憾x$的行為。
??:matrix不能直接用$取列
- length()和str_length()
y <- c('aaa','fhuv','dvh')
length(y)
# [1] 3
str_length(y)
# [1] 3 4 3
- tidyr包可以實現僅按照某一列來去除缺失值、缺失值替換(replace_na函數)
- 長腳本管理方式
- 分成多個腳本,每個腳本最后保存Rdata,下一個腳本開頭清空再加載。
- if(F){...} ,則{ }里的腳本被跳過 if(T){...} ,則{ }里的腳本被運行 凡是帶有{ }的代碼,均可以被折疊。
- data.frame里取1行生成的是只有1行的數據框,但取1列生成的是向量。
df <- data.frame(x=1:5,y=letters[3:7],z=rnorm(5))
class(df[2,])
# [1] "data.frame"
class(df[,2])
# [1] "character"
class(df[2]) #取單列但想生成數據框,不加逗號即可(不設置取行還是取列默認取列)
# [1] "data.frame"
??因此如果想取數據框中的部分行,在方括號中直接輸入行數即可,返回的仍然是數據框。但如果加了逗號,會喪失數據框的格式,也就是會使數據框的行名(往往是基因名)丟失。
- 復制別的文件夾的文件到當前目錄
a = dir("../pipeline/",pattern = "R$")[2:6] #提取需要復制的文件,dir()顯示某個目錄下有哪些文件,pattern = "R$"是顯示以.R結尾的文件(代碼)。
for (i in a) {
file.copy(paste0("../pipeline/",i),"./") # file.copy():復制文件
}
- 保存圖片時圖片命名小技巧
在前面把實驗project(如GSE編號)單獨生成并保存,比如:
gse_number = "GSE56649" #要研究的GSE編號
后面存圖時可以用paste0連接GSE編號和圖片類型及后綴,這樣不同數據的分析得到的圖片名就跟數據相一致。
ggsave(plot = pca_plot,filename = paste0(gse_number,"_PCA.png"))
save(pca_plot,file = "pca_plot.Rdata")
- R語言4.0版本以上默認 options(stringsAsFactors = F)
- factor()函數可以把有重復值的向量變成因子
factor()自動生成的levels默認按字母順序排列,所以在設置的時候,最好直接指定levels。
#設置參考水平,指定levels,對照組在前,處理組在后,不能反
Group = factor(Group,
levels = c("control","patient"))
- R語言的S3和S4對象
參考:https://www.jianshu.com/p/8f605946f0b9
- read.table(), read.csv(), import()這些函數都支持直接讀取壓縮了的文件,不需解壓。
dat = read.table("counts.tsv.gz",check.names = F,row.names = 1,header = T)
- R語言中的波浪號(~):用來連接公式中的響應變量(波浪號左邊)和自變量(波浪號右邊)。更多說明可查看help("~")
- dir("路徑")函數,返回該路徑下的所有文件/文件夾的名稱(不包含文件夾中的子文件/文件夾)。
dir()函數有一個參數recursive,默認為F。當設置recursive=T 時,會列出該目錄下所有文件,包括文件夾中的文件。
-
do.call() 函數--將list扁平化
R語言有類型豐富的數據結構,很多時候數據結構比較復雜,需要使用list數據結構。但是list對象很難以文本的形式導出,因此需要一個函數快速將復雜的list結構扁平化成dataframe。使用do.call函數可以進行這個操作。簡單的講,do.call函數的功能就是執(zhí)行一個函數,而這個函數的對象是list的每個子元素。
do.call(what, args, quote = FALSE, envir = parent.frame())
參數 |
含義 |
what |
either a function or a non-empty character string naming the function to be called. 也就是想要對list執(zhí)行的函數 |
args |
a list of arguments to the function call. The names attribute of args gives the argument names. 想要操作的list |
quote |
a logical value indicating whether to quote the arguments. |
envir |
an environment within which to evaluate the call. This will be most useful if what is a character string and the arguments are symbols or quoted expressions. |
clinical <- do.call(rbind,cl) #把cl列表中的每一個元素(數據框)按行合并
- 取整數:向上取整和向下取整。
as.integer()取整數是直接去掉小數位,保留整數,而不會進行四舍五入。
跟as.integer()對應的是ceiling(),是向上取整。
as.integer(1.1)
# [1] 1
as.integer(1.9)
# [1] 1
ceiling(1.1)
# [1] 2
ceiling(1.9)
# [1] 2
- with函數
# 差異表達矩陣DEG取cutoff值判斷基因是上調還是下調時:
logFC_cutoff <- DEG$mean(abs(log2FoldChange)) + 2*sd(DEG$log2FoldChange) )
# 如果不想每次都寫DEG,就可以使用with函數,將DEG寫在with函數的第一個參數,DEG的列名就可以直接作為變量來用。
logFC_cutoff <- with(DEG,mean(abs(log2FoldChange)) + 2*sd(abs(log2FoldChange)) )
- 將表達矩陣中的字符串轉換成數字(apply函數)
class(exp[1,1])
# [1] "character"
exp=apply(exp,2,as.numeric)
class(exp[1,1])
# [1] "numeric"
- round函數:保留小數點后幾位
round(0.34524)
# [1] 0
round(0.34524,2)
[1] 0.35
round(0.34524,4)
# [1] 0.3452
- 若有文件較大,可以按如下方式寫代碼。運行后保存,再次運行如果有這個文件存在則不再運行(存在即跳過)
tmp_rf="TCGA_KIRC_miRNA_rf_output.Rdata"
if(!file.exists(tmp_rf)){
rf_output=randomForest(x=x, y=y,importance = TRUE, ntree = 10001, proximity=TRUE )
save(rf_output,file = tmp_rf)
}
load(file = tmp_rf)
- ggplot2改變柱狀圖的順序(其它圖改橫軸順序也是這個思路)
ggplot2畫圖時默認是按字母排列順序來對樣本進行繪制,但這有時并不符合實際情況。這時就需要進行調整。
library(ggplot2)
library(ggthemes)
dt = data.frame(obj = c('D','B','C','A','E'), val = c(2,15,6,9,7))
ggplot(dt, aes(x = obj, y = val, fill = obj, group = factor(1))) +
geom_bar(stat = "identity", width = 0.5)
通過將變量因子化來設置柱條的順序
dt$obj = factor(dt$obj, levels=c('D','B','C','A','E'))
ggplot(dt, aes(x = obj, y = val, fill = obj, group = factor(1))) +
geom_bar(stat = "identity", width = 0.5)
- 將稀疏矩陣轉為普通矩陣直接用
as.matrix 就可以
m1 <- as.matrix(sM)
##具體可以查看methods
grep("as.matrix", methods(class = "sparseMatrix"), value = TRUE)
#[1] "as.matrix,Matrix-method"
|