美文网首页
3.R 杂笔记-基础语法

3.R 杂笔记-基础语法

作者: caokai001 | 来源:发表于2020-11-22 10:38 被阅读0次

    55.安装SDMTools 下架

    R - Can't install 'SDMTools' for R version 3.6.2

    install.packages("remotes")
    remotes::install_version("SDMTools", "1.1-221")
    

    54.安装XML包报错

    install.packages("XML", repos = "http://www.omegahat.net/R")
    

    53.大文件读取 data.table / fread

    情形:比如说每一列最后面多一个tab , fread 读入正常,但是基础函数读入就会报错。

    52.快捷键失效

    lenovo 快捷键失效:ctrl+1 修改成ctrl+up.

    51. R 进行归一化方法

    scale函数对矩阵归一化是按行归一化,还是按列归一化?
    scale 默认按列归一化,同时pheatmap 提供scale 参数可以按列和按行归一化.

    50.正则表达式 (\ 与\)

    image.png

    49. dplyr常用操作

    如果想用select()过滤未数字的列,可以使用!is.numeric(.),这里的代表function

    msleep %>%
      select_if(~!is.numeric(.)) %>%
      glimpse
    
    ## summarize 对特定列进行统计,at 后接列名称向量
      mtcars %>% 
        group_by(cyl) %>% 
        summarise_at(c("mpg", "disp", "hp"), mean)
    

    48. R语言设置相关

    • 其R包安装位置
      https://blog.csdn.net/sinat_35187039/article/details/80239668
      函数: .libPaths(): 指明下载的包解压后,安装的位置,默认是R.exe上一级目录下library 文件夹
      参数:libdestdir :分别指出文件下载的位置,以及解压后安装到位置。如果lib 不写,默认解压安装到 libPath()里面
    image.png
    • R options设置
    rm(list = ls()) 
    # 不输出waring
    options(warn=-1) 
    # 字符串不转换成因子
    options(stringsAsFactors = F)
    
    
    

    47. do.call 最完善的解释

    通过帮助文档知道了,do.call 第二个参数,必须是list,可以把它转换成tmp[[1]],tmp[[2]],tmp[[3]],sep="\t" 四个参数进行传递给paste

    do.call("paste", c(tmp, sep = ""))
    等同于
    paste(tmp[[1]],tmp[[2]],tmp[[3]], sep = "")
    

    46.升级 R https://blog.csdn.net/orchidzouqr/article/details/94384557

    • 最好用Rgui 运行
    install.packages("installr")
    library(installr)
    updateR()
    # updateR(fast=TRUE,cran_mirror="https://mirrors.ustc.edu.cn/CRAN/")
    
    

    45.load与data 的区别

    load() 应该是从文件中载入数据,需要指定该文件的路径,而该文件是先前使用 save() 保存下来的,其格式与系统缺省所保存的 .RData 一样。

    data() 是从已安装的包中载入数据,不需要指定文件路径

    >save(B,file="1.RData")
    >load("1.RData")
    > ls()
    [1] "B"
    > B
    [1] 1 2 3 4 5 6 7 8
    
    

    44.ifelse和if_else 差别

    当test1 第一列在test2 中,最后一列赋值为1
    尝试了ifelse,if_else ,发现if_else 只能对condition判断进行输出,不能对原变量进行修改及其赋值。
    apply 和 for 循环类似,是对每一列操作后,输出为data.frame。

    > test1
                V1           V3           V4           V5          V6         V7           V8
    1  chr17,chr17  0.005539355  0.039044000  0.122098804  0.15646555 0.02944775  0.001091181
    2  chr11,chr17 -0.002308293 -0.021429420 -0.015162463  0.09823601 0.07250968 -0.004267148
    3   chr17,chr6 -0.002009416 -0.010506168  0.057401288  0.08913235 0.04825522 -0.004040490
    4   chr1,chr17  0.010890329 -0.001355257  0.050541960  0.05530440 0.05670207 -0.005107226
    5   chr17,chr2  0.015338174  0.011412834  0.037120402 -0.03438133 0.02997743 -0.020807328
    6  chr17,chr19  0.011352259  0.005457897  0.017193813  0.07226271 0.05071934 -0.007017304
    7   chr17,chr9 -0.016986335 -0.009784664  0.045798458  0.07713509 0.05663328 -0.013103256
    8  chr12,chr17 -0.016105516 -0.036733203  0.007333334  0.19082880 0.09036952  0.006711165
    9  chr17,chr21  0.018684294 -0.016253024 -0.017760037 -0.05845185 0.05585530 -0.020302733
    10 chr16,chr17  0.039056275  0.012903601  0.029835701 -0.06858563 0.03015597 -0.015712518
                 V9          V10         V11 V12
    1   0.022112789  0.069530450 0.006017665   0
    2   0.003515933 -0.011290263 0.012123219   0
    3   0.008340748  0.050997686 0.006665931   0
    4  -0.030897608  0.023426734 0.004465404   0
    5  -0.040782742 -0.042077541 0.007696471   0
    6  -0.007638139  0.016115718 0.007552080   0
    7   0.013801019  0.002422534 0.005766133   0
    8   0.036535345  0.034734201 0.012055983   0
    9  -0.056969829 -0.079630174 0.009267730   0
    10 -0.054881822 -0.003083119 0.005709210   0
    
    > test2
             nodeA category
    1    chr1,chr4        0
    2  chr17,chr19        0
    3  chr11,chr18        0
    4    chr2,chr7        0
    5  chr11,chr19        0
    6   chr13,chr9        0
    7   chr19,chr9        0
    8  chr11,chr12        0
    9   chr1,chr16        0
    10   chr5,chr6        0
    
    ################################
    test1 <-  read.delim("test1.txt",sep = " ",stringsAsFactors = F)
    test2 <- read.delim("test2.txt",sep = " ",stringsAsFactors = F)
    
    
    library(tidyverse)
    tbl_df(test1) %>% mutate(V12=if_else(V1 %in% test2$nodeA,"1","0"))
    
    # for (i in 1:nrow(test2)){
    #   if_else(test1[i,1] %in% test2$nodeA,
    #           test1[i,11] <- "1",
    #           test1[i,11] <-"0")
    # }
    test1$V12 <- "null"
    
    
    for (i in 1:nrow(test2)){
    ifelse(test1[i,1] %in% test2$nodeA , test1[i,11] <- "1" , test1[i,11] <- "0") 
      print(test1[i,11])
    }
    
    

    43.R数据对象处理函数(三)-精确、部分和完全匹配

    精确、部分和完全匹配

    %in%,match
    match(str_trim(tmp_neast_gene_1M_df[["genename"]]) , rownames(match_exp_file),nomatch = NA)
    
    rownames(match_exp_file) %in% str_trim(tmp_neast_gene_1M_df[["genename"]]) 
    

    42.部分场景"<" 和"=" 不能通用

    1.data.frame("a"=c(1:3) ,"b"=c(2:4))
    2.ifesle(条件,A <-2)
    3.函数赋值
    

    41. trycatch 机制

    (1)抓取错误
    tryCatch(libray(xx),error=function(e){print("出现错误")} )
    结果:
    [1] "出现错误"
    当xx包出现错误时候就会执行error函数   ,把error的结果执行出来
    
    (2)抓取错误和警告
    tryCatch(libray(xx),warning = function(w){print("出现警告")},
                   error=function(e){print("出现错误")} )
    
    (3)finally最后都会执行,跟python和java类似
    tryCatch(libray(xx),warning = function(w){print("出现警告")},
                   error=function(e){print("出现错误")},
                   
              
                   finally={
                     print("导入ggplot2包")
                     library(ggplot2)
                   }
      )
    
    

    40.存储单个参数

    Tips:
    1.一般通过default 存储默认值,当只需要存储一个值用action="store_true"

    1. 在帮助信息里面展示 实例的输入参数metavar :
    library(optparse)
    parser <- OptionParser(description = "calculate relation between somatic and expression!")
    parser <- add_option(parser, c("-s", "--snp_file"), type="character",
                    action="store", default="", help="input somatic snp file")
                    
    parser <- add_option(parser, c("-m", "--motif_file"), type="character",
                    action="store", default="", help="input motif position file")
                    
    parser <- add_option(parser, c("-e", "--exp_file"), type="character", 
                    default="", help="expression data (matrix:row_gene,column:sample)",
                    metavar="expression_example")
    
    parser <- add_option(parser, c("-v", "--version"), action="store_true",
                    default=TRUE, help="Print version output [default]")
                    
    # opt <- parse_args(parser, args = c("--help","--quietly", "--count=15"))
    opt <- parse_args(parser)
    if(opt$version){
        cat("Version : 0.1\n")
    }
    
    
    snp_file = opt$snp_file
    motif_file = opt$motif_file
    exp_file = opt$exp_file
    cat(snp_file,motif_file,exp_file,"\n")
    

    39.比较 match%in% 差别

    示例 都是两个向量,包含关系操作:
    %in% 返回的是TRUE和FALSE
    match 返回的是位置

    r$> rep(1, 3) %in% 1:5                                                                                         
    [1] TRUE TRUE TRUE
    r$> match(c(1,6)  ,1:5)                                                                                        
    [1]  1 NA
    

    38.按照绝对值对向量排序

    T<-c(-2,-1,0,1,2)
    T[order(abs(T))]
    

    37.相同组进行合并

    总结:分组有时候还必须用基础函数来完成,aggregate

    处理前:
    sample1 chr1    2
    sample2 chr1    2
    sample4 chr2    55
    sample3 chr2    55
    处理后:
      Gene GOid           merge
    1 chr1    2 sample1,sample2
    2 chr2   55 sample4,sample3
    

    R 脚本:
    aggregate分组后,V1是一个矩阵,所以使用merge=paste(.$V1[,1],.$V1[,2],sep = ",")合并;
    transmutemutate 差别:mutate 添加新列,trnasmute 建立新的数据框.

    tmp <- read.table(file="clipbroad")
    aggregate(tmp,by=list(tmp$V2,tmp$V3),unlist) %>%transmute(Gene = .$Group.1, GOid = .$Group.2,merge=paste(.$V1[,1],.$V1[,2],sep = ","))
    

    R语言中aggregate函数
    两个用法:
    aggregate(x, by, FUN, ..., simplify = TRUE)
    aggregate(formula, data, FUN, ..., subset, na.action = na.omit)
    实现对分组后统计:前者对所有的列统计;后者对部分列统计。当然可以用到data.table的 [] 高级用法。

    r$> aggregate(mpg~cyl+am,mtcars,length)                                                                                                                                                         
      cyl am mpg
    1   4  0   3
    2   6  0   4
    3   8  0  12
    4   4  1   8
    5   6  1   3
    6   8  1   2
    
    r$> aggregate(mtcars,list(cyl+am),FUN=length)                                                                                                                                                   
      Group.1 mpg cyl disp hp drat wt qsec vs am gear carb
    1       4   3   3    3  3    3  3    3  3  3    3    3
    2       5   8   8    8  8    8  8    8  8  8    8    8
    3       6   4   4    4  4    4  4    4  4  4    4    4
    4       7   3   3    3  3    3  3    3  3  3    3    3
    5       8  12  12   12 12   12 12   12 12 12   12   12
    6       9   2   2    2  2    2  2    2  2  2    2    2
    

    36.R 基础语法

    class查看第一层类别,mode查看第二层类别,typeof查看第三层类别

    35.基础语法

    1.去掉na 元素

    r$> chafen-lag(chafen)                                                                                                                                   
     [1]  NA   9  -8   9  -5  -1  -1   5 -10  -3
    r$> T[!is.na(T)]                                                                                                                                         
    [1]   9  -8   9  -5  -1  -1   5 -10  -3
    

    2.lag,diff 使用

    r$> lag(chafen-lag(chafen))                                                                                                                              
     [1]  NA  NA   9  -8   9  -5  -1  -1   5 -10
    r$> diff(chafen-lag(chafen) )                                                                                                                            
    [1]  NA -17  17 -14   4   0   6 -15   7
    

    3.R基础命令
    使用n() 一般处于函数里,slice( n()),summarize(n())

    34.R 分组运算

    cowplot 插图

    方法:
    d[,.(),by=var] ;aggregate() ; groupby_summarize()

    d <- data.table(x = 1, y = 1:10, z = factor(1:10))
    d$grp=cut(as.numeric(d$z),breaks=c(0,2,5,7,11),labels = c("min", "low", "mod", "high"))
    
    image.png

    33.堆积图

    微信ggplot2折线图学习之二(面积图)
    R 语言绘图速查手册(58图)

    image.png

    32.paste和paste0差别

    paste与paste0还有一个collapse参数,可以把这些字符串拼成一个长字符串,而不是放在一个向量

    31.时间格式化

    cat(">> generating figure...\t\t", 
                    format(Sys.time(), "%Y-%m-%d %X"), "\n")
    

    30.对list 每个变量进行处理,同时保留list 的名称

    尝试过lapply 发现只会考虑每个变量值,不考虑变量名称,于是考虑使用mapply 添加names 参数

    • 返回向量或者matrix,不是list
    L=list("x"=c(1,2,3),
         "y"=c(2,6,5),
         "z"=c(5,4,6))
    
    ## 1.
    mapply(function(x,y){paste0(sum(x)," ",y)}, L,names(L))
         x      y      z 
     "6 x" "13 y" "15 z" 
    

    29.科学计数法保留一定位数

    保留小数位数

    • 取整运算:ceiling(),floor(),trunc()和round()
    • 有效小数:round()
    • 有效数字:signif()
    numb <- c(0.05, 0.05671, 0.000000027) 
    formatC(numb, format = "e", digits = 2) 
    ##
    [1] "5.00e-02" "5.67e-02" "2.70e-08" 
    

    28.R 函数可选参数

    参数match.arg

    ont 参数只能为"BP","CC","MF" 中间一个。match.arg

     f<-function(ont="CC"){
       ont=match.arg(ont,c("BP","CC","MF"))
       print(ont)
     }
     
     f(ont="CC")
     f(ont = "CP")
    
    

    27.R 并行

    要传递一个变量,您将必须使用lapply或sapply类似的并行版本。但是,要传递许多变量,必须使用mapply或的并行版本Map。那会是clusterMap

    library(parallel)
    # 单核计算
    system.time({
    res <- lapply(seq(ncol(TF_Permute_matrix)), RunPairsTF);
    })
    
    # 多核并行计算
    detectCores(logical = F)  # 24
    mc <- getOption("mc.cores", 23)
    system.time({
    res <- mclapply(seq(ncol(TF_Permute_matrix)), RunPairsTF,mc.cores = mc)
    })
    
    

    26.R 多级子目录

    dir.create(work_dir, showWarnings = TRUE, recursive = FALSE,mode = "0777")
    # 或者
    system(paste0("mkdir -p ",work_dir))
    

    25.向量组合,及其排列组合

    expand.grid() 所有可能组合

    ### expand.grid 和combn 使用
    combn(letters[1:4], 2)
    # 矩阵上下旋转
    apply(m1.1,rev)
    # 所以的组合
    expand.grid(letters[1:4],letters[1:4])
    
    # permute函数
    Permute <- function(TF_vector) {
      TF_combind_matrix <- combn(TF_vector, 2)
      TF_Permute_matrix <- cbind(TF_combind_matrix, apply(TF_combind_matrix, 2, rev))
      return(TF_Permute_matrix)
    }
    
    > L=c("A","B","C")
    > Permute(L)
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,] "A"  "A"  "B"  "B"  "C"  "C" 
    [2,] "B"  "C"  "C"  "A"  "A"  "B" 
    > apply(Permute(L),2,function(x)paste0(x[1],x[2]))
    [1] "AB" "AC" "BC" "BA" "CA" "CB"
    

    24.R语言-NULL和NA的区别

    1、R语言中,NA代表位置上的值为空,NULL代表连位置都没有,变量为空。
    2、判断语句
    判断向量中的元素是否没有值:is.na()
    判断向量是否空值:is.null()  
    
    

    23.R 函数

    var <<- value
    ...;..1;....2  # 但是函数...位置必须有参数
    args()  # 查询函数输入参数
    formals()  #查询函数参数,及其默认值
    alist()  # 修改函数参数
    exists("dnase") # 检测变量是否存在
    get("dnase") 
    assign("x",dnase)
    

    22.加载不输出过程信息;下载文件

    # 加载欢迎信息
    .onAttach <- function(libname, pkgname) {
      packageStartupMessage("Welcome to my package")
    }
    
    # 不加载欢迎信息
    suppressPackageStartupMessages(library("deconstructSigs")) 
    
    
    # 不输出waring
    options(warnings = -1)
    
    ## 下载文件
    download.file(url,filename)
    ## 删除文件
    file.remove("filename")
    

    21.conda 创建R环境

    conda create -n my-r-env -c r r-essentials
    # or
    # conda install -c conda-forge r-essentials
    

    20.R读入excel 文件

    install.packages("gdata")
    library(gdata)
    read.xls("/home/slave/test.xls",sheet=1,na.strings=c("NA","#DIV/0!"))
    

    19. readr 读入没header 数据

    • col_names=FLASE
    • 列名为X1


      image.png

    18.R 修改默认源

    [kcao@localhost ~]$ vi ~/.Rprofile
    
    options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor")
    options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
    

    17.R语言关于脚本文件的输入和输出

    R语言的输出函数cat,sink,writeLines,write.table

    http://www.dxy.cn/bbs/thread/26662861#26662861
    print输出的字符都是只能显示在控制台,而控制台只能显示文本,所以你所说的回车、制表符都是原样显示。

    r$> cat("1\n")                                                                                                        
    1
    
    r$> print("1\n")                                                                                                      
    [1] "1\n"
    

    实现输出重定向 ,类似linux ">>"

    sink()可以重定向文本输出,但它对图形输出没有影响。要重定向图形输出,使用表中列出的函数即可。最后使用dev.off()将输出返回到终端。


    实例:

    sink("myoutput",append=TRUE,split=TRUE)  ## 文本输出重定向
    pdf("mygraph.pdf")   ## 开启图形重定向
    source("script.r")
    
    sink()    ## 关闭文本重定向
    dev.off()  ## 关闭图形重定向
    
    

    16.对因子分组

    library(tidyverse)
    x <- tibble(
    var = factor( rep( c(paste0("Factor ",1:9)),each = 4))
    
    x%>%
    mutate( collapsed__var = fct_collapse(var,
    `Group 1` = c("Factor 1", "Factor 2", "Factor 3"),
    `Group 2` = c("Factor 4","Factor 5","Factor 6"),
    `Group 3`= c("Factor 7","Factor 8","Factor 9")) )
    
    image.png

    15.类似python append ,添加到向量里

    vector=c()
    for (i in 1:length(values))
      vector[i] <- values[i]
    
    

    14.R语言System {base}函数简介

    • 函数system的作用是,调用由参数command指定的操作系统命令。
      用法如下:
    system(command, intern = FALSE, 
           ignore.stdout = FALSE, ignore.stderr = FALSE, 
           wait = TRUE, input = NULL, show.output.on.console = TRUE, 
           minimized = FALSE, invisible = TRUE)
    
    image.png
    • 例:
    > a=system(paste0("cat ", filename ,"| wc -l"),intern = TRUE)
    > a
    [1] "9877"
    

    13.R 数据分列

    • separate 函数。一句代码就完成了分列,而直接分列则太繁琐了,强烈推荐使用tidyr包
    PS:separate函数用法
    separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE,
    convert = FALSE, extra = "warn", fill = "warn", ...)
    主要参数:
    data:需要分列的数据框
    col:分列列名
    into:分列后新的列名(文本向量)
    sep:分割符号
    remove:逻辑值,输出时是否移去分列列
    

    举例:

    > as.data.frame(region) %>%head()
                    region
    1   chr1:818879-819093
    2 chr1:1281801-1282015
    3 chr1:1291925-1292139
    4 chr1:1610178-1610392
    5 chr1:1883561-1883775
    6 chr1:2032278-2032492
    > as.data.frame(region) %>%head() %>%separate(region,into=c("chr","start","end"),sep=":|-")
       chr   start     end
    1 chr1  818879  819093
    2 chr1 1281801 1282015
    3 chr1 1291925 1292139
    4 chr1 1610178 1610392
    5 chr1 1883561 1883775
    6 chr1 2032278 2032492
    

    12.dplyr 对数字排序

    • arrange(as.number())
    > data%>%group_by(number)%>%summarize(mean(length))%>%ungroup()%>%separate(number,c("_","n"),"_")%>%arrange(as.numeric(n))
    # A tibble: 10 x 3
       `_`    n     `mean(length)`
       <chr>  <chr>          <dbl>
     1 number 0               188.
     2 number 1               237.
     3 number 2               261.
     4 number 3               327.
     5 number 4               390.
     6 number 5               352.
     7 number 6               359 
     8 number 8               612 
     9 number 9               194 
    10 number 16              528 
    

    11. featurecount 矩阵转换成TPM

    ## R  数据整理
    data=read.table("featureCounts222.txt",comment="#",header=2,check.names=FALSE)
    clean_data=tbl_df(data)%>%select(1,6:12)
    clean_data%>%colnames()%>%as.vector()%>%str_split("/")%>%sapply(function(x){x[length(x)]})
    colnames(clean_data)<-clean_data%>%colnames()%>%as.vector()%>%str_split("/")%>%sapply(function(x){x[length(x)]})
    ##
    test_data<-head(clean_data,100)
    colnames(test_data)
    countToTPM<-function(test_data){
        n<-length(test_data)-2 
        sample_name<-colnames(test_data)[-1:-2]
        new_name=paste(sapply(sample_name,function(x){t1=str_split(x,"[.]");t2=unlist(t1)[1]}),"_TPM",sep="")
        for (i in seq(1:6)){  ##<----1:6 可以换成1:n
            Value<-test_data[sample_name[i]]*1e3/test_data["Length"]
            test_data[new_name[i]]<-Value[[sample_name[i]]]
            }
        a<-test_data[colnames(test_data)%>%str_detect("TPM")]%>%sapply(function(x){x*1e6/sum(x)})
        b<-test_data[1:8]
        return(cbind(b,a))
        }
    TPM_data=countToTPM(clean_data)
    write.table(TPM_data,file="TPM_data.csv",sep="\t",row.names=FALSE)
    
    
    

    10.R 语言各种分布

    image.png

    9 迷人的多参数批量函数mapply

    原创: 果子 [果子学生信](javascript:void(0);) 5月13日

    1.R 批量读取png图片
    library(png)
    files=list.files(pattern = "*.png")
    fpng<-lapply(files, readPNG)
    names(fpng)<-files
    # 小知识:
    #>  x1 = 1:10
    #> x2 = 11:20
    #>  x3 = 21:30
    #>  data.frame(x1,x2,x3)
    #> do.call(fun,list())  # 将list 作为一个综合参数,传给fun;\
    #与lapply 作用于每个list 元素不太一样。
    
    2.批量读取Rdata
    files = list.files(pattern="*.Rdata")
    fload2 = lapply(files,load,.GlobalEnv)
    fload3 = lapply(files,load,environment())
    fload = lapply(files, function(x) get(load(x)))
    
    3.get / assign 类似python eval /exec
    https://blog.csdn.net/u011402596/article/details/42924561
    # assign 批量赋值
    
    for(i in 1:3){
      assign(paste("p", i, sep=""), i)
      tmp <- get(paste("p", i, sep=""))
      print(tmp)
    }
    [1] 1
    [1] 2
    [1] 3
    ls()
    [1] "i"   "p1"  "p2"  "p3"  "tmp"
    
    4.mapply 和lapply 差别
    A=list(A=c(5),B=c(2))
    lapply(A, rep,2)
    #例子理解
    mapply(rep, A)
    mapply(rep, times=1:4, x=4:1)
    mapply(function(x,y){x^y},x=c(2,3),y=c(3,4))
    # 没必要写名称,依次遍历索引元素。
    mapply(function(x,y){x^y},c(a=2,b=3),c(A=3,B=4))
    mapply(function(x,y){x^y},c(a=2,b=3),c(A=3,B=4),USE.NAMES=FALSE)
    unlist(mapply(rep,c(1,2,6,9,14),c(1,4,5,2,3)))
    
    
    

    8.果子归一化

    • rank 函数
      1.order(): 记录排序后的位置。
      2.sort 排序后数组
      3.rank 排序前,记录原来的位置。可以从排序后的数组中,恢复原有模样。
    • apply(df,2,fun,args) 用法
      对列排序,同时可以对fun添加参数args
    > V <-c(7, 5, 3, 1, 6, 2, 8)
    > order(V)
    [1] 4 6 3 2 5 1 7
    > sort(V)
    [1] 1 2 3 5 6 7 8
    > V[order(V)]
    [1] 1 2 3 5 6 7 8
    > sort(V) == V[order(V)]
    [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    
    > rank(V)
    [1] 6 4 3 1 5 2 7
    > sort(V)[rank(V)]
    [1] 7 5 3 1 6 2 8
    

    Quntile Normalization 实现:

    • 调用包
    library(BiocInstaller)
    biocLite("preprocessCore")
    library(preprocessCore)
    new <- normalize.quantiles(quntile_test)
    
    
    一步步过程
    • 一步步
    # 归一化
    quntile_test <- matrix(c(2,5,4,3,3,4,14,8,8,9,4,4,6,5,3,5,7,9,8,5),ncol=4,byrow = F)
    
    boxplot(quntile_test)
    
    ## 写函数
    df <- data.frame(c(2,5,4,3,3),c(4,14,8,8,9),c(4,4,6,5,3),c(5,7,9,8,5))
    colnames(df) <- paste0("Sample",seq(1,4))
    rownames(df) <- paste0("Gene",seq(1,5))
    df
    
    df_rank <- apply(df,2,rank,ties.method="first")
    df_sorted <- data.frame(apply(df, 2, sort))
    df_mean <- apply(df_sorted, 1, mean)
    
    index_to_mean<-function(my_index,my_mean){
      return(my_mean[my_index])
    }
    df_final=apply(df_rank,2,index_to_mean,df_mean)
    boxplot(df_final)
    
    
    
    image.png

    7.果子学生信-统计

    image.png

    http://cc.shutcm.edu.cn/G2S/eWebEditor/uploadfile/20150301150144726.pdf

    image.png

    apply 使用,判断多列

    T=data.frame(A=sample(c("+","-"),8,replace =T),B=sample(c("+","-"),8,replace =T),C=sample(c("+","-"),8,replace =T))
    pd <- function(x) {
      if((x[1]=="+") & (x[2]=="-")){
        print( "ok")
      } else {
        print("no")
      }
    }
    T$"D"=apply(T, 1, pd)
    

    6.去除NA;保存为0

    > A=data.frame(a=c(5,NA,7),b=c(6,7,NA))
    > A
       a  b
    1  5  6
    2 NA  7
    3  7 NA
    > write.table(A,file = "test.csv",na = "0")
    
    

    5.p.adjust 调整

    Gene = 1:7
    t.values = c(-0.66, 1.02, 3.2, 2.7, 1.1, 2.5, 0.33)
    p.values = 2 * pt(abs(t.values), df = 100, lower.tail = FALSE)
    
    p.BH = p.adjust(p.values, method="BH")
    p.B = p.adjust(p.values, method="bonferroni")
    
    ### Make things pretty ###
    
    p.values = round(p.values, 3)
    p.BH = round(p.BH, 3)
    p.B = round(p.B, 3)
    
    S.BH = p.BH < 0.05
    S.B = p.B < 0.05
    
    Data = data.frame(Gene, t.values, p.values, p.BH, S.BH, p.B, S.B)
    
    Data
    
    ###  Gene t.values p.values  p.BH  S.BH   p.B   S.B
    ###     1    -0.66    0.511 0.596 FALSE 1.000 FALSE
    ###     2     1.02    0.310 0.434 FALSE 1.000 FALSE
    ###     3     3.20    0.002 0.013  TRUE 0.013  TRUE
    ###     4     2.70    0.008 0.029  TRUE 0.057 FALSE
    ###     5     1.10    0.274 0.434 FALSE 1.000 FALSE
    ###     6     2.50    0.014 0.033  TRUE 0.098 FALSE
    ###     7     0.33    0.742 0.742 FALSE 1.000 FALSE
    
    

    4.apply and sweep

    通常先进行apply 在对统计结果进行sweep 操作。

    apply 及其sweep 进行Z-score 标准化 (表达量-均值)/标准差
    t()可以对矩阵转置,sweep() 可以按行按列进行处理原始数据,因为默认是按照列处理。

    # 行为基因,列为样本,现在对基因进行标准化
    standardize <- function(x) {
    rowmean <- apply(x, 1, mean)
    rowsd <- apply(x, 1, sd)  
    rv <- sweep(x, 1, rowmean,"-")  #表达量-均值
    rv <- sweep(rv, 1, rowsd, "/")  #再除以标准差
    return(rv)
    }
    

    sweep 使用

    > test <- matrix(c(1,2,3,11,12,13),nrow = 2,ncol=3)
    > test
         [,1] [,2] [,3]
    [1,]    1    3   12
    [2,]    2   11   13
    > depth
    [1]  3 14 25
    > sweep(test,2,depth,"/")
              [,1]      [,2] [,3]
    [1,] 0.3333333 0.2142857 0.48
    [2,] 0.6666667 0.7857143 0.52
    # 或者
    t(t(test)/colSums(test))
    

    3.读R书笔记-中文电子书

    ## 1.创建data.frame
    data <- read.table(header = T, text = "
     subject   sex size
                       1   M    7
                       2   F    6
                       3   F    9
                       4   M   11
                       ")
    x <- 6
    n <- 1:4
    let <- LETTERS[1:4]
    df <- data.frame(n, let)
    
    vx <- c(1, 2, 3, NULL, 5)
    mean(vx)
    
    a <- "apple"
    b <- "banana"
    
    
    as.formula("y ~ x1 + x2")
    
    ##2 .collapse 向量内拼接
    
    measurevar <- "y"
    groupvars <- c("x1", "x2", "x3")
    
    # 存在一些变量名:
    measurevar <- "y"
    groupvars <- c("x1", "x2", "x3")
    
    # 创建合适的字符串:  
    paste(measurevar, paste(groupvars, collapse = " + "), sep = " ~ ")
    
    
    5.数据导入与导出
    ###3.选择文件
    read.csv(file.choose())
    #从网上下载数据框
    data <- read.csv("http://www.cookbook-r.com/Data_input_and_output/Loading_data_from_a_file/datafile-noheader.csv", 
                     header = FALSE)
    #从键盘上输入的方法之一
    data <- read.table(stdin(), header=TRUE)
    # 从剪切板
    data <- read.table('clipboard', header=TRUE)
    # 可以将带分隔符的数据写入终端( stdout() )
    write.csv(data, stdout(), row.names=FALSE)
    # 重定向到文件
    sink()
    
    6.数据处理
    # 去重unique(x)
    # cut 实现多个条件判断功能
    data$category <- cut(data$control, breaks = c(-Inf, 7, 9, 
                                                  Inf), labels = c("low", "medium", "high"))
    #forcats package  https://github.com/tidyverse/forcats
    fct_reorder(): Reordering a factor by another variable.
    fct_infreq(): Reordering a factor by the frequency of values.
    fct_relevel(): Changing the order of a factor by hand.
    fct_lump(): Collapsing the least/most frequent values of a factor into “other”.
    
    # 数据框与列联表互换
    table(cases)
    as.data.frame(table(cases))
    
    
    
    

    2. 计算标准误差std.err

    library(dplyr) 
    aspen %>% 
        group_by(year,Spp,CO2) %>% 
        summarise_each(funs(mean,sd,se=sd(.)/sqrt(n()))) 
    
    library(plotrix) 
        summary <- aspen %>% group_by(year,Spp,CO2) %>% 
    summarise_each(funs(mean,sd,std.error))) 
    

    1. R循环赋值

    如何计算FIMO score

    x=array(,c(3,4,2))
    for(i in 1:2){
      for(j in 1:3){
        x[j,,i]=j+i
      }
    }
    

    R 判断元素是否在vertor 中
    which match any == %in%

    R 语言矩阵除法

    # mat 为矩阵,dev为被除的num
    t(t(mat) / dev)
    
    mat / dev[col(mat)] #  @DavidArenburg & @akrun
    
    mat %*% diag(1 / dev)
    
    sweep(mat, 2, dev, "/")
    
    t(apply(mat, 1, "/", dev))
    
    plyr::aaply(mat, 1, "/", dev)
    
    mat / rep(dev, each = nrow(mat))
    
    mat / t(replace(t(mat), TRUE, dev))
    
    mapply("/", as.data.frame(mat), dev)  # added later
    
    mat / matrix(dev, nrow(mat), ncol(mat), byrow = TRUE)  # added later
    
    do.call(rbind, lapply(as.data.frame(t(mat)), "/", dev))
    
    mat2 <- mat; for(i in seq_len(nrow(mat2))) mat2[i, ] <- mat2[i, ] / dev
    

    相关文章

      网友评论

          本文标题:3.R 杂笔记-基础语法

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