美文网首页
六、R语言进阶

六、R语言进阶

作者: 白米饭睡不醒 | 来源:发表于2021-01-22 20:26 被阅读0次

    1.tidyverse

    (1)tidyr 核心函数

    1)数据清理
    ### 原始数据
    
    test <- data.frame(geneid = paste0("gene",1:4),
                     sample1 = c(1,4,7,10),
                     sample2 = c(2,5,0.8,11),
                     sample3 = c(0.3,6,9,12))
    test
    
    ### 扁变长
    
    test_gather <- gather(data = test,
                        key = sample_nm,
                        value = exp,
                        - geneid)
    head(test_gather)
    
    ### 长变扁
    
    test_re <- spread(data = test_gather,
                    key = sample_nm,
                    value = exp)
    head(test_re)
    
    1
    2)分割和合并
    ### 原始数据
    test <- data.frame(x = c( "a,b", "a,d", "b,c"));test
    
    ### 分割
    test_seprate <- separate(test,x, c("X", "Y"),
    sep = ",");test_seprate
    
    ### 合并
    test_re <- unite(test_seprate,"x",X,Y,sep = ",")
    
    3)处理NA
    ### 原始数据
    X<-data.frame(X1 = LETTERS[1:5],X2 = 1:5)
    X[2,2] <- NA
    X[4,1] <- NA
    
    ### 1.去掉含有NA的行,可以选择只根据某一列来去除
    
    drop_na(X)
    drop_na(X,X1)
    drop_na(X,X2)
    ### 2.替换NA
    
    replace_na(X$X2,0)
    
    ### 3.用上一行的值填充NA
    X
    fill(X,X2)
    

    2.dplyr

    (1)五个基础函数

    1)新增列
    rm(list = ls())
    
    ## 包和数据的准备
    if(!require(dplyr))install.packages("dplyr")
    library(dplyr)
    test <- iris[c(1:2,51:52,101:102),]
    rownames(test) =NULL
    
    
    ###1.mutate(),新增列
    mutate(test, new = Sepal.Length * Sepal.Width)
    
    2)按列筛选
    ###2.select(),按列筛选
    ####(1)按列号筛选
    select(test,1)
    select(test,c(1,5))
    
    ####(2)按列名筛选
    select(test,Sepal.Length)
    select(test, Petal.Length, Petal.Width)
    vars <- c("Petal.Length", "Petal.Width")
    select(test, one_of(vars))
    #####一组来自tidyselect的有用函数
    select(test, starts_with("Petal"))
    select(test, ends_with("Width"))
    select(test, contains("etal"))
    select(test, matches(".t."))
    select(test, everything())
    select(test, last_col())
    select(test, last_col(offset = 1))
    
    ####(4)利用everything(),列名可以重排序
    
    select(test,Species,everything())
    
    3)按行筛选
    ###3.filter()筛选行
    filter(test, Species == "setosa")
    filter(test, Species == "setosa"&Sepal.Length > 5 )
    filter(test, Species %in% c("setosa","versicolor"))
    
    4)按某一列对整个表格进行排序
    ###4.arrange(),按某一列对整个表格进行排序
    
    arrange(test, Sepal.Length)#默认从小到大排序,逗号再加一列就是按两列排序
    arrange(test, desc(Sepal.Length))#用desc从大到小
    arrange(test,  desc(Sepal.Width),Sepal.Length)
    
    #基础包里(?)
    test=iris[c(1,2,51,52,101,102),]
    o=order(test$Sepal.Length)
    test$Sepal.Length[o]
    x[order(x)]
    sort(x)
    test[o,]
    
    5)汇总
    #对数据进行汇总操作,结合group_by使用实用性强
    
    summarise(test, mean(Sepal.Length), sd(Sepal.Length))
    # 计算Sepal.Length的平均值和标准差:
    
    # 先按照Species分组,计算每组Sepal.Length的平均值和标准差
    group_by(test, Species)
    tmp = summarise(group_by(test, Species),
                    mean(Sepal.Length), 
                    sd(Sepal.Length))#分组汇总
    

    (2)两个实用技能

    1)管道操作
    ###1:管道操作 %>% (cmd/ctrl + shift + M)
    #上一步的输出作为下一步的输入
    
    library(dplyr)
    x1 = filter(iris,Sepal.Width>3)
    x2 = select(x1,c("Sepal.Length","Sepal.Width" ))
    x3 = arrange(x2,Sepal.Length)
    
    #管道符号的作用可变成下面的
    colnames(iris)
    iris %>% 
      filter(Sepal.Width>3) %>% 
      select(c("Sepal.Length","Sepal.Width" ))%>%
      arrange(Sepal.Length)
    
    2)count统计某列的unique值
    ###2:count统计某列的unique值
    
    count(test,Species)
    
    ##处理关系数据:即将2个表进行连接,注意:不要引入factor
    options(stringsAsFactors = F)
    
    test1 <- data.frame(name = c('jimmy','nicker','doodle'), 
                        blood_type = c("A","B","O"))
    test1
    test2 <- data.frame(name = c('doodle','jimmy','nicker','tony'),
                        group = c("group1","group1","group2","group2"),
                        vision = c(4.2,4.3,4.9,4.5))
    test2 
    
    test3 <- data.frame(NAME = c('doodle','jimmy','lucy','nicker'),
                        weight = c(140,145,110,138))
    merge(test1,test2,by="name")
    merge(test1,test3,by.x = "name",by.y = "NAME")
    
    ###1.內连inner_join,取交集
    inner_join(test1, test2, by = "name")
    inner_join(test1,test3,by = c("name"="NAME"))
    
    ###2.左连left_join
    left_join(test1, test2, by = 'name')
    
    left_join(test2, test1, by = 'name')
    ###3.全连full_join
    full_join(test1, test2, by = 'name')
    
    ###4.半连接:返回能够与y表匹配的x表所有记录semi_join
    semi_join(x = test1, y = test2, by = 'name')
    
    ###5.反连接:返回无法与y表匹配的x表的所记录anti_join
    anti_join(x = test2, y = test1, by = 'name')
    
    ###6.数据的简单合并
    #在相当于base包里的cbind()函数和rbind()函数;
    #注意,bind_rows()函数需要两个表格列数相同,而bind_cols()函数则需要两个数据框有相同的行数
    
    test1 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))
    test1
    test2 <- data.frame(x = c(5,6), y = c(50,60))
    test2
    test3 <- data.frame(z = c(100,200,300,400))
    test3
    bind_rows(test1, test2)
    bind_cols(test1, test3)
    
    

    3.stringr

    rm(list = ls())
    if(!require(stringr))install.packages('stringr')
    library(stringr)
    
    x <- "The birch canoe slid on the smooth planks."
    
    x
    ###1.检测字符串长度
    length(x)#返回几个字符串
    str_length(x)#返回字符串里有几个字符
    
    ###2.字符串拆分与组合
    str_split(x," ")#按照空格对x进行拆分
    x2 = str_split(x," ")[[1]]#拆出来是个列表,只要列表的第一个元素
    y2 = str_split(y," ",simplify = T)#把拆出来的列表变成矩阵
    str_c(x2,collapse = " ")#连接组合在一起 ,内部连接连成一个元素
    str_c(x2,1234,sep = "+")#各自连接,连成八个新的元素
    
    ###3.提取字符串的一部分
    str_sub(x,5,9)#从第五位提取到第九位
    
    ###4.大小写转换
    str_to_upper(x2)#全大写
    str_to_lower(x2)#全小写
    str_to_title(x2)#首字母大写
    
    ###5.字符串排序
    str_sort(x2)
    
    ###6.字符检测
    str_detect(x2,"h")#检测向量里每一个元素里是否含有h这个字母,有就是True不含有就是false
    str_starts(x2,"T")#判断是否以T开头
    str_ends(x2,"e")#判断是否以e结尾
    
    ###与sum和mean连用,可以统计匹配的个数和比例
    sum(str_detect(x2,"h"))
    mean(str_detect(x2,"h"))
    as.numeric(str_detect(x2,"h"))
    
    ###7.提取匹配到的字符串
    str_subset(x2,"h")
    
    ###8.字符计数
    str_count(x," ")#数x里有多少个空格
    str_count(x2,"o")
    
    ###9.字符串替换
    str_replace(x2,"o","A")#把x里的o变成A,但多个o只会替换第一个
    str_replace_all(x2,"o","A")#在上面的基础上全部替换为A
    
    ###结合正则表达式更加强大
    
    

    4.条件语句和循环语句

    (1)ifelse函数

    x可以为逻辑值也可以为向量,因为ifelse支持循环

    2
    rm(list = ls())
    
    ## 一.条件语句
    
    ###1.if(){ }
    
    #### (1)只有if没有else,那么条件是FALSE时就什么都不做
    
    
    i = -1
    if (i<0) print('up')
    if (i>0) print('up')
    
    #理解下面代码
    if(!require(tidyr)) install.packages('tidyr')
    
    #### (2)有else,做A这件事还是做B这件事的区别
    i =1
    if (i>0){
      cat('+')
    } else {
      print("-")
    }#cat是打印出本来样子,print是带着引号之类的代表它是向量的一个字符串的因素
    
    ifelse(x,yes,no)
    ifelse(i>0,"+","-")
    
    x=rnorm(10)
    y=ifelse(x>0,"+","-")
    y
    
    #### (3)多个条件
    i = 0
    if (i>0){
      print('+')
    } else if (i==0) {
      print('0')
    } else if (i< 0){
      print('-')
    }
    
    ifelse(i>0,"+",ifelse((i<0),"-","0"))
    case_when()#自己探索
    
    
    ### 2.switch()
    cd = 3
    foo <- switch(EXPR = cd, 
                  #EXPR = "aa", 
                  aa=c(3.4,1),
                  bb=matrix(1:4,2,2),
                  cc=matrix(c(T,T,F,T,F,F),3,2),
                  dd="string here",
                  ee=matrix(c("red","green","blue","yellow")))
    foo
    

    (2)长脚本管理方式

    3 4

    (3)For 循环

    1.for循环
    #**顺便看一下next和break**
    x <- c(5,6,0,3)
    s=0
    for (i in x){
      s=s+i
      #if(i == 0) next #next为进行下一轮循环,跳过次轮
      #if (i == 0) break #循环终止
      print(c(which(x==i),i,1/i,s))
    }#i在第一轮是x里的第一个元素,第二轮是x的第二个元素...以此类推
    
    x <- c(5,6,0,3)
    s = 0
    for (i in 1:length(x)){
      s=s+x[[i]]
      #if(i == 3) next
      #if (i == 3) break
      print(c(i,x[[i]],1/i,s))
    }
    #如何将结果存下来?
    s = 0
    result = list()
    for(i in 1:length(x)){
      s=s+x[[i]]
      result[[i]] = c(i,x[[i]],1/i,s)
    }
    do.call(cbind,result)#把他变成矩阵
    
    
    ### 2.while 循环(危险)
    i = 0
    
    while (i < 5){
      print(c(i,i^2))
      i = i+1
    }
    
    ### 3.repeat 语句
    
    #注意:必须有break
    i=0L
    s=0L
    repeat{
     i = i + 1
     s = s + i
     print(c(i,s))
     if(i==50) break
    }
    

    5.apply函数

    5
    rm(list = ls())
    ## apply()族函数
    
    ### 1.apply 处理矩阵或数据框
    
    #apply(X, MARGIN, FUN, …) 
    #其中X是数据框/矩阵名;
    #MARGIN为1表示取行,为2表示取列,FUN是函数
    
    test<- iris[,1:4]
    
    apply(test, 2, mean)#对test的列求平均值
    
    apply(test, 1, sum)
    
    res <- c()
    
    for(i in 1:nrow(test)){
      res[[i]] <- sum(test[i,])
    }
    res#这一段可代替apply的作用,没啥用
    
    
    ### 2.lapply(list, FUN, …) 
    # 对列表/向量中的每个元素(向量)实施相同的操作
    
    test <- list(x = 36:33,
                 y = 32:35,
                 z = 30:27)
    
    #返回值是列表,对列表中的每个元素(向量)求均值(试试方差var,分位数quantile)
    
    lapply(test,mean)
    class(lapply(test,mean))
    
    x <- unlist(lapply(test,mean));x#取消列表变成向量
    class(x)
    
    ### 3.sapply 处理列表,简化结果,直接返回矩阵和向量
    
    #sapply(X, FUN, …) 注意和lapply的区别,返回值不一样
    
    lapply(test,min)
    sapply(test,min)
    lapply(test,range)#range取最大值和最小值 
    sapply(test,range)
    
    class(sapply(test,range))
    
    

    相关文章

      网友评论

          本文标题:六、R语言进阶

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