一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

R語言細節(jié)匯總

 鐘山紫竹林 2023-01-26 發(fā)布于遼寧
  1. 運行腳本的快捷鍵:cmd+enter (mac)
  2. 工作目錄是指腳本、數據、圖片的默認保存位置,也是文件讀取的默認位置。
    我們使用project來管理工作目錄

開始一個新的R語言數據分析新項目,管理腳本、圖片、文件的推薦方式:打開Rstudio,新建Rproject,新建腳本(腳本存放在生成的Rproject文件夾中)。

  1. 控制臺上的提示符不是'>’而是'+’時,提示命令不完整,解決辦法是將其補齊或者將光標放在控制臺最后一行,按ESC退出。
  2. 邏輯型向量除了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沒有“占著”位置,或者說“不知道”有沒有真正的數據。

  1. 打開Rproject中的腳本,出現亂碼,可以選擇file--Reopen with Encoding--UTF8來重新打開。
  2. 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"
  1. 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 
  1. 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中一個值時的所有行

  1. 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)

  1. 代碼不換行,用分號分割,和換行效果一樣。
m=1:5;m
# [1] 1 2 3 4 5
  1. 對單個向量進行的操作中比較重要的幾個函數:
    length() 、unique(x)、duplicated(x)、table(x)、sort(x)
  2. 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)]
  1. 列表取子集,使用[]取出的還是列表,是只有一個元素的列表。[[]]取出的才是列表中的元素。
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"
  1. 網絡問題經常導致github訪問不了,可以先在github上下載把code下載下來,再選擇install_local()本地安裝
devtools::install_local("AnnoProbe-master.zip",upgrade = F)
  1. 下載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/")
  1. 加載R包除了library()函數還有require()函數
    如果安裝了某個包,require()就會返回TRUE,并加載R包。沒安裝就會返回FALSE
if(!require(stringr))install.packages("stringr")
#意思是如果'stringr’包沒有安裝,就安裝'stringr’包。
if(TRUE) #后面的代碼被運行
if(FALSE) #后面的代碼被跳過
  1. 查看R包的在線教程幫助文檔:browseVignettes()函數(browseVignettes不是每個包都有)
browseVignettes("stringr")
  1. 查看某個R包中有哪些函數
# 以dplyr包為例
library(dplyr)
ls('package:dplyr')
  1. R語言能讀取的文件格式

用于讀取/導出文件的R包

rio可以不用區(qū)分讀入文件類型,大部分文件可直接用import()讀取。

  1. @和$的區(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不能直接用$取列

  1. length()和str_length()
y <- c('aaa','fhuv','dvh')
length(y)
# [1] 3
str_length(y)
# [1] 3 4 3
  1. tidyr包可以實現僅按照某一列來去除缺失值、缺失值替換(replace_na函數)
  2. 長腳本管理方式
  • 分成多個腳本,每個腳本最后保存Rdata,下一個腳本開頭清空再加載。
  • if(F){...} ,則{ }里的腳本被跳過 if(T){...} ,則{ }里的腳本被運行 凡是帶有{ }的代碼,均可以被折疊。
  1. 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"

??因此如果想取數據框中的部分行,在方括號中直接輸入行數即可,返回的仍然是數據框。但如果加了逗號,會喪失數據框的格式,也就是會使數據框的行名(往往是基因名)丟失。

  1. 復制別的文件夾的文件到當前目錄
a = dir("../pipeline/",pattern = "R$")[2:6] #提取需要復制的文件,dir()顯示某個目錄下有哪些文件,pattern = "R$"是顯示以.R結尾的文件(代碼)。
for (i in a) {
  file.copy(paste0("../pipeline/",i),"./") # file.copy():復制文件
}
  1. 保存圖片時圖片命名小技巧
    在前面把實驗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")
  1. R語言4.0版本以上默認 options(stringsAsFactors = F)
  2. factor()函數可以把有重復值的向量變成因子
    factor()自動生成的levels默認按字母順序排列,所以在設置的時候,最好直接指定levels。
#設置參考水平,指定levels,對照組在前,處理組在后,不能反
Group = factor(Group,
               levels = c("control","patient"))
  1. R語言的S3和S4對象
    參考:https://www.jianshu.com/p/8f605946f0b9
  2. read.table(), read.csv(), import()這些函數都支持直接讀取壓縮了的文件,不需解壓。
dat = read.table("counts.tsv.gz",check.names = F,row.names = 1,header = T)
  1. R語言中的波浪號(~):用來連接公式中的響應變量(波浪號左邊)和自變量(波浪號右邊)。更多說明可查看help("~")
  2. dir("路徑")函數,返回該路徑下的所有文件/文件夾的名稱(不包含文件夾中的子文件/文件夾)。
    dir()函數有一個參數recursive,默認為F。當設置recursive=T時,會列出該目錄下所有文件,包括文件夾中的文件。
  3. 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列表中的每一個元素(數據框)按行合并
  1. 取整數:向上取整和向下取整。
    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
  1. 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)) )
  1. 將表達矩陣中的字符串轉換成數字(apply函數)
class(exp[1,1])
# [1] "character"
exp=apply(exp,2,as.numeric)
class(exp[1,1])
# [1] "numeric"
  1. round函數:保留小數點后幾位
round(0.34524)
# [1] 0
round(0.34524,2)
[1] 0.35
round(0.34524,4)
# [1] 0.3452
  1. 若有文件較大,可以按如下方式寫代碼。運行后保存,再次運行如果有這個文件存在則不再運行(存在即跳過)
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)
  1. 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)
  1. 將稀疏矩陣轉為普通矩陣直接用as.matrix就可以
m1 <- as.matrix(sM) 
##具體可以查看methods
grep("as.matrix", methods(class = "sparseMatrix"), value = TRUE) 
#[1] "as.matrix,Matrix-method" 

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美成人免费视频午夜色| 国产成人精品综合久久久看| 欧美一区二区三区在线播放| 夫妻性生活动态图视频| 好吊妞视频这里有精品| 亚洲一区二区三区四区| 中文日韩精品视频在线| 九九九热视频最新在线| 日韩精品视频免费观看| 国产又粗又黄又爽又硬的| 国产午夜福利不卡片在线观看| 97人摸人人澡人人人超碰| 日本午夜福利视频免费观看| 99久只有精品免费视频播放| 九九热这里只有免费精品| 国产一区二区三区成人精品| 国产又粗又猛又大爽又黄同志| 日韩欧美黄色一级视频| 国产成人精品在线播放| 国产不卡免费高清视频| 五月婷婷六月丁香在线观看| 久热99中文字幕视频在线| 欧美一区二区三区不卡高清视| 国产成人精品一区二区在线看| 91日韩欧美在线视频| 国产又粗又长又大的视频| 欧美国产亚洲一区二区三区| 中字幕一区二区三区久久蜜桃 | 热情的邻居在线中文字幕| 成人午夜激情免费在线| 国产精品白丝久久av| 激情图日韩精品中文字幕| 欧美亚洲三级视频在线观看| 国产成人综合亚洲欧美日韩| 内用黄老外示儒术出处| 欧美特色特黄一级大黄片| 欧美尤物在线视频91| 一个人的久久精彩视频| 亚洲伦理中文字幕在线观看| 亚洲欧美国产中文色妇| 国产欧美韩日一区二区三区|