美文网首页scRNA及包
R语言细节汇总

R语言细节汇总

作者: Hayley笔记 | 来源:发表于2021-05-31 23:26 被阅读0次
    1. 运行脚本的快捷键:cmd+enter (mac)
    2. 工作目录是指脚本、数据、图片的默认保存位置,也是文件读取的默认位置。
      我们使用project来管理工作目录

    开始一个新的R语言数据分析新项目,管理脚本、图片、文件的推荐方式:打开Rstudio,新建Rproject,新建脚本(脚本存放在生成的Rproject文件夹中)。

    1. 控制台上的提示符不是‘>’而是‘+’时,提示命令不完整,解决办法是将其补齐或者将光标放在控制台最后一行,按ESC退出。
    2. 逻辑型向量除了TRUE和FALSE,还有NA。

    NA和null的区别:
    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表示未知的状态。在运算时不会被计算。如x<-c(1,2,3,NULL,4),取mean(x),结果会返回2.5。NULL是不算数的,length(c(NULL))为0,而length(c(NA))为1。可见NA“占着”位置,它存在着,而NULL没有“占着”位置,或者说“不知道”有没有真正的数据。

    1. 打开Rproject中的脚本,出现乱码,可以选择file--Reopen with Encoding--UTF8来重新打开。
    2. paste和paste0的区别: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语言的数据类型是存在优先顺序的。其顺序为:
      字符型 > 数值型 > 逻辑型
    #一个向量中只允许一种数据类型存在
    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"
    

    若要逆着优先顺序操作,将返回NA

    as.numeric('tree')
    # [1] NA
    # Warning message:
    # NAs introduced by coercion 
    
    1. x==y 和 x %in%y 的区别⚠️

    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个值来一一对应着比对,因为两者长度不同,会发生循环补齐,其效果如下图,明显不是我们想要的结果。

    x%in%y:选出x是y中一个值时的所有行

    1. x[x %in%y]和intersect(x,y)的区别
      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://mirrors.ustc.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可以不用区分读入文件类型,大部分文件可直接用import()读取。

    1. @和$的区别
      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类重写了。可以自己定义$的行为。
    ⚠️: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函数的功能就是执行一个函数,而这个函数的对象是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执行的函数
    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" 
    

    相关文章

      网友评论

        本文标题:R语言细节汇总

        本文链接:https://www.haomeiwen.com/subject/sruisltx.html