• R语言-tidyr和dplyr


    一、安装和加载

    1、安装并加载tidyr和dplyr包

    install.packages("tidyr")
    library(tidyr)
    install.packages("dplyr")
    library(dplyr)
    

    2、读取数据

    expression <- read.delim("gene_expression.txt",sep="\t",header = T)
    

    二、tidyr包操作

    %>%    #用于实现将一个函数的输出传递给下一个函数的第一个参数。相当于管道,优先级高于赋值
    stocksm <- stocks %>% gather(stock, price, -time) #先执行右面的,结果赋值给stocksm
    
    #短数据变成长数据
    tidy_gather <- gather(data=expression,key=Samplename,value = Expression,-id)
    data  #“数据框名”
    #关于key-value,原始数据一个“列名-列值”对应一个“key-value”
    key   #“key名”,新生成的key列,值为转化的列的列名
    value #“value名”,新生成的value列,值为对应列名的列的值,
    ...   #列的选择。如果为空,则选择所有变量。可以提供裸变量名,使用x:z选择x和z之间的所有变量,使用-y排除y。
    
    #长数据变短数据
    tidy_spread <- spread(tidy_gather,key=Samplename,value = Expression) #gather逆向
    
    #按列分割
    #给定正则表达式或字符位置向量,separate()会将单个字符列转换为多个列。
    separate(
      data,    #数据框
      col,     #要分割的列名或位置
      into,    #作为字符向量创建的新变量的名称。使用NA来省略输出中的变量。
      sep = "[^[:alnum:]]+",  #列之间的分隔符。sep的数量应该比into少1。
    #如果是字符,sep被解释为正则表达式。默认值是匹配任何非字母数字值序列的正则表达式。
    #如果是数字,sep被解释为要在其中拆分的字符位置。正值从字符串最左边的1开始;负值从字符串最右边的-1开始。
      remove = TRUE,    #如果为TRUE,则从输出数据帧中移除输入列。
      extra = "warn",   #如果sep是一个字符向量,这将控制当有太多片段时发生的情况。有三个有效的选项:
    #"warn"(默认):发出警告并删除额外值。
    #"drop":在没有警告的情况下删除任何额外的值。
    #"merge":只分割最多(into)次
      fill = "warn",    #如果sep是一个字符向量,这将控制当没有足够的片段时发生的情况。有三个有效的选项:
    #"warn"(默认):发出警告并从右侧填充
    #"right":填充右边缺失的值
    #"left":在左边填充缺失的值
    )
    #按列合并
    tidy_unite <- 
    unite(tidy_separate,col=Samplename,into=c("Source","Samplename"),sep="_")
    

    三、dplyr包操作

    #按id进行排序
    dplyr_arrange <- arrange(tidy_gather , id ) 
    
    #按id进行排序的基础上按Expression的降序排列,后面可以继续添加其他变量
    dplyr_arrange1 <- arrange(tidy_gather,id,desc(Expression)) 
    dplyr_arrange1 <- arrange(tidy_gather,id,-Expression) #desc()可以用-替代
    
    #排序时添加分组
    mtcars %>% group_by(cyl)%>% arrange(desc(wt), .by_group = TRUE)
    
    #筛选行
    filter(starwars, hair_color == "none" & eye_color == "black")
    filter(starwars, hair_color == "none", eye_color == "black")  #相当于使用 &
    filter(starwars, hair_color == "none" | eye_color == "black")
    
    #加管道筛选
    starwars %>% filter(mass > mean(mass, na.rm = TRUE))
    starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE))
    Result <- filter( tidy_gather , Expression>1 ) %>% arrange( Expression )
    
    #展示指定的GeneId SampleName  Expression 列
    dplyr_select <- select( tidy_separate , id , Samplename , Expression )
    dplyr_select <- select( tidy_separate , -Source )  #可使用-排除
    
    #增加新列,将现有的字段经过计算后生成新字段。
    dplyr_mutate <- mutate( tidy_gather , ID=sub( "gene", "Gene", id ) ) #sub函数将id列的"gene"替换为"Gene"
    
    #分组统计
    mtcars %>%
    +     group_by(cyl) %>%
    +     summarise(mean = mean(disp), n = n())   #根据cyl分组,统计各组中disp的平均值以及组的大小
    
    #按行合并,行索引
    bind_rows(a , c)
    
    #按列合并,列索引
    bind_cols(a , c#取并集,按列索引
    union(a , c#取差集,按列索引,保留a不同于c的部分
    setdiff(a , c)
    
    #内连接,按行,只保留a、b共有的x1值的行
    inner_join(a,b,by=“x1”)
    
    #全连接,按行,保留全部,空值用NA补齐
    full_join(a,b,by=“x1”)
    
    #左连接,按行,其中a全部保留
    left_join(a,b,by=“x1”)
    
    #右连接,按行,其中b全部保留
    right_join(a,b,by=“x1”)
    
    #a中所有在b中匹配的行
    semi_join(a,b,by=“x1”)
    
    #a中所有在b中不匹配的行
    anti_join(a,b,by="x1") 
    
  • 相关阅读:
    go rand 包
    Redis实战案例及问题分析之分布式锁解决优惠券秒杀场景集群并发下的安全问题
    跨越断层,突破边界
    数字电路学习
    【并发编程】史上最详细的ReentrantReadWriteLock源码刨析
    Chapter6视觉处理基础
    【分布式技术专题】「架构实践于案例分析」盘点高并发场景的技术设计方案和规划
    基于Redis网络模型的简易网络库
    YOLOv9理性解读 | 网络结构&损失函数&耗时评估
    CUDA 编程基础
  • 原文地址:https://www.cnblogs.com/hs3434/p/16658569.html