dplyr软件包是R中功能最强大,最受欢迎的软件包之一。该软件包由最受欢迎的R程序员Hadley Wickham编写,他编写了许多有用的R软件包,如ggplot2,tidyr等。本文包括一些示例和如何使用使用dplyr软件包来清理和转换数据。这是一个关于数据操作和数据处理的完整教程。

什么是dplyr?

dplyr是一个强大的R软件包,用于处理,清理和汇总非结构化数据。简而言之,它使得R中的数据探索和数据操作变得简单快捷。

dplyr有什么特别之处?

软件包“dplyr”包含许多主要使用的数据操作功能,例如应用过滤器,选择特定列,排序数据,添加或删除列以及聚合数据。这个包的另一个最重要的优点是学习和使用dplyr函数非常容易。也很容易回想起这些功能。例如,filter()用于过滤行。dplyr函数处理速度比基本R函数快。 这是因为dplyr函数是以计算有效的方式编写的。 它们在语法上也更稳定,并且比向量更好地支持数据帧。以下是该包中的方法与用途:

dplyr

Function

Description

Equivalent SQL

select()

Selecting

columns (variables)

SELECT

filter()

Filter (subset) rows.

WHERE

group_by()

Group the data

GROUP BY

summarise()

Summarise (or aggregate) data

-

arrange()

Sort the data

ORDER BY

join()

Joining data frames (tables)

JOIN

mutate()

Creating New Variables

COLUMN ALIAS

dplyr中主要方法的使用

filter系列:筛选出自己想要的数据

#安装与加载包

#直接使用内置的iris、mtcars数据集来演示

#iris数据集中,筛选Species为“setosa”,并且Sepal.Length大于5的样本

#"&"也可以替换成“,”

>filter(iris, Species == "setosa" & Sepal.Length >= 5.5)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1          5.8         4.0          1.2         0.2  setosa

2          5.7         4.4          1.5         0.4  setosa

3          5.7         3.8          1.7         0.3  setosa

4          5.5         4.2          1.4         0.2  setosa

5          5.5         3.5          1.3         0.2  setosa

filter支持以下几种判断形式:

关系类型:、 >=、==、!=、is.na()、 !is.na()

&、 |、 !、 xor() #针对向量集的操作判断

between()、%in%、 near() #sqrt(2) ^ 2 == 2 返回FALSE,near(sqrt(2) ^ 2, 2)则TRUE

all_vars()、any_vars() #出现于filter_all、filter_at、filter_if中,作为判断条件

filter系列,还有几个变异函数:filter_all、filter_at、filter_if

#筛选任何变量>150的样本

filter_all(mtcars, any_vars(. > 150))

#筛选变量以“d”结尾,并且变量 "%%2" 等于0

filter_at(mtcars, vars(starts_with("d")), any_vars((. %% 2) == 0))

# 筛选变量向下取整 == 原变量数值, 并且这部分变量的数值!= 0 的样本集

filter_if(mtcars, ~ all(floor(.) == .), all_vars(. != 0))

更多用法:

mtcars %>% filter_all(all_vars(.>150)) %>% head() # 筛选所有变量均大于150的行,结果为空

mtcars %>% filter_all(any_vars(.>150)) %>% head() # 筛选存在变量大于150的行,

# 针对变量名称为d开头的所有列,筛选存在变量能整除2的所有行

mtcars %>% filter_at(vars(starts_with("d")), any_vars((.%% 2) == 0))

# 针对变量全为整数的列,筛选所有变量非0的所有行

mtcars %>% filter_if(~all(floor(.) == .), all_vars(.!= 0))

# 支持purrr语法筛选

mtcars %>% filter_at(vars(hp, vs), ~ .%% 2 == 0) # 筛选hp和vs变量都是偶数的所有行

select 函数:仅保留你所需要的列,并支持修改变量名称

用法:select(.data, …)

与之前讲解的filter有所不同,select是筛选变量的,而filter是筛选样本集。

应用场景:假设数据存于宽表中(比如有100个变量的表),而你仅需要其中几个变量。而select的关键在于”…“的判断条件

#mtcars数据集中,筛选mpg、cyl、wt、vs,4个变量数据

#mtcars[,c("mpg","cyl","wt","vs")],可以实现相同的功能

>select(mtcars,c("mpg","cyl","wt","vs"))

mpg cyl    wt vs

21.0   6 2.620  0

21.0   6 2.875  0

22.8   4 2.320  1

#Tips:select 同样支持":"与"-"操作

#比如:select(mtcars,c("mpg":"vs"))、表示连续的列选择

#select(mtcars,-"mpg") 删除mpg列

以上给人感觉,不通过select,利用数据框与向量操作,同样可以做到,select 真正强大的地方在于,支持以下几种条件判断:

包含关系:starts_with()、 ends_with()、 one_of()

匹配关系:matches()、contains()、num_range()

#包含关系:在Iris中,筛选以Petal开头,或Width结尾的变量

>select(iris, starts_with("Petal"), ends_with("Width"))

#Petal.Length Petal.Width Sepal.Width

#1.4         0.2         3.5

#1.4         0.2         3.0

#1.3         0.2         3.2

#...(数据省略)

#Tips:starts_with("Petal"), ends_with("Width"),2个条件不是 "且" 的关系,而是 "或"

#包含关系:经常需要提取变化的数据集合,利用one_of再合适不过了

#提取mtcars中,"mpg","cyl","wt","vs" ,"vss"

>var1

>select (mtcars, one_of(var1))

#mpg cyl    wt vs

#21.0   6 2.620  0

#21.0   6 2.875  0

#2.8   4 2.320  1

#...(省略数据)

#Warning message: Unknown columns: `vss`

#Tips: select没找到额变量,系统会返回警告

#匹配关系:筛选Iris数据集,变量名中带有"wid"的变量名

>select(iris, matches(".wid."))

>select(iris, contains("wid"))

#Sepal.Width Petal.Width

#3.5         0.2

#3.0         0.2

#num_range能高效匹配变量名称类似x01, x02, x03的

#随机数据框,由X1~X5,y 组成:

df

x3= runif(10), x4= runif(10),

x5= runif(10), y= letters[1:10])

#筛选 y, x1:x3的变量,并且把y重命名为 var1

>select(df, c(var1 = "y", num_range("x", 1:3)))

#var1  x1         x2        x3

#a 0.96631605 0.29815009 0.6545414

#b 0.61046600 0.76547552 0.8247191

#c 0.70510879 0.46636723 0.4472588

#... (数据省略)

mutate系列:对数据进行计算产生新数据

用法:mutate(.data, …)

mutate的使用方式,主要是依靠"…"的公式变化,生成新的变量

mutate支持以下几种公式 :

+、-、*、÷ 、%%、%|% 等常用计算方式

lead()、 lag()

dense_rank(), min_rank(), percent_rank(), row_number(), cume_dist(), ntile()

cumsum(), cummean(), cummin(), cummax(), cumany(), cumall()

na_if(), coalesce()

if_else(), recode(), case_when()

先从"rank"系列开始介绍,这一函数类,主要是用来划分名次、等级、百分比、密度等等

#############简单的+、-、*、÷ 、%%、%|%   可以增加新的数据列

>mutate(mtcars,aa=hp-drat,bb=mpg*cyl)

mpg cyl  disp  hp drat    wt  qsec vs am gear carb     aa    bb

1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 106.10 126.0

2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 106.10 126.0

3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1  89.15  91.2

4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 106.92 128.4

5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 171.85 149.6

6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 102.24 108.6

7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 241.79 114.4

#######如果只想保留这些新的变量可以:

>transmute(mtcars,aa=hp-drat,bb=mpg*cyl)

aa    bb

1  106.10 126.0

2  106.10 126.0

3   89.15  91.2

4  106.92 128.4

5  171.85 149.6

6  102.24 108.6

##########percent_rank,按照[0,1]百分比的形式进行排序

#举例说明,按照x的数值,按照百分比进行划分

x

percent_rank(x)

#[1] 1.00 0.00 0.50 0.25 0.75

#这类函数比较适用于 ,需要排名次的场景。比如考试、比赛...

#比如根据iris中的Sepal.Length,进行百分比表示, 其中 %>% 管道的标识符,select函数中,everything()可以用来更换变量顺序

>iris %>% mutate(Length_rank = percent_rank(Sepal.Length)) %>% select(Length_rank,everything())

#Length_rank Sepal.Length Sepal.Width Petal.Length Petal.Width Species

#0.21476510          5.1         3.5          1.4         0.2  setosa

#0.10738255          4.9         3.0          1.4         0.2  setosa

#...(数据省略)

#row_number(),不仅可以用来对想来排序,也可以表示获取行数

mutate(mtcars, row_number() == 1L) # 新生成的变量,用来判断是否是第一行,返回TRUE 或者 FALSE

mtcars %>% filter(between(row_number(), 1, 10)) # 通过row_number,筛选1-10行.有点类似 top_n(10)

#ntile,切割数据集为N块,返回具体的数值,属于等分切割

ntile(runif(10), 5)

#[1] 1 2 4 5 5 3 4 2 3 1

#某种程度上,ntile可以用来划分训练集和测试集(类似sample函数)

#ind

#mtcars[ind == 1,]

#备注:ntile对数据框使用的时候,如果没有特殊标明具体的数据列,ntile会对所有的列进行切割操作

再说一下"cum"函数系列,这类函数计算累积指标,比如截止到某一天的平均值、总和、乘积等等。

# cumsum,累积相加的数值

cumsum(1:10)

# 1  3  6 10 15 21 28 36 45 55

# 原数据集有N个,返回也是N个

# 类似MS_SQL中的sum(s)over(order by y)

# cumany(), cumall(),则是逻辑判断,并非计算数值

cumall(-5:5)

# TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

# 返回的是逻辑值,0代表FALSE

最后说一下"判断"函数系列,这类函数应用比较广泛。

比如生活中,当天空下雨了,小明就打伞了

类似EXCEL中的 if函数,vlookup函数等等

# if_else

# 用法:if_else(condition, true, false, missing = NULL),比传统的ifelse多了一个missing参数

# 并且if_else能保留原数据的数据类型,不会降维操作

# 假设x >= 0,则 y-1,y

df

df %>% mutate( xy = if_else(x >= 0, y -1, y+1, y))

#     x         y         xy

#   -5    0.7760150  1.7760150

#   -4    0.9310976  1.9310976

# case_when中,判断的条件可以更加的多样化

# case_when,与SQL中的case...when...一样

# 同C语言中的switch一样

x

case_when(

x %% 2 == 0 ~ "偶",

x %% 2 == 1 ~ "奇",

TRUE ~ as.character(x)

#可以设置一个默认值

)

"奇" "偶" "奇" "偶" "奇" "偶" "奇" "偶" "奇" "偶" NA

arrange 用于数据排序

arrange() 函数以行为单位进行排序,默认为升序排列,降序使用 desc( ) 函数。第一个参数为数据集名称,后面为排序依据变量。

> arrange(mtcars,hp,mpg,cyl )

mpg cyl  disp  hp drat    wt  qsec vs am gear carb

1  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2

2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2

3  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1

4  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1

5  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1

6  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2

7  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1

8  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2

9  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1

10 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1

多列排序,降序用desc()

> arrange(mtcars,desc(hp),mpg,cyl )

mpg cyl  disp  hp drat    wt  qsec vs am gear carb

1  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

2  15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4

3  13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4

4  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4

5  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4

6  10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4

7  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4

8  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3

9  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3

10 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3

sample_n() and sample_frac()按行随机选取数据子集

sample_n() and sample_frac() 分别是按固定多少行随机选取,一个是按行数的比例选取;

> sample_n(mtcars,10)

mpg cyl  disp  hp drat    wt  qsec vs am gear carb

1  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2

2  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4

3  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1

4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1

5  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2

6  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

7  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4

8  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1

9  15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4

10 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2

> sample_frac(mtcars,0.1)

mpg cyl disp  hp drat   wt  qsec vs am gear carb

1 10.4   8  472 205 2.93 5.25 17.98  0  0    3    4

2 14.3   8  360 245 3.21 3.57 15.84  0  0    3    4

3 13.3   8  350 245 3.73 3.84 15.41  0  0    3    4

%>% 数据管道综合运用举例

data(iris)

data(mtcars)

iris %>% head()

mtcars %>% head()

# 筛选变量名为字符串开头的变量

iris %>% select(starts_with("Sepal")) %>% head()

# 多个筛选条件

iris %>% select(-starts_with("Sepal")) %>% head()

# 筛选变量名为字符串结尾的变量

iris %>% select(ends_with("Length")) %>% head()

iris %>% select(-ends_with("Length")) %>% head()

# 将变量Species移动到最前面

iris %>% select(Species, everything()) %>% head()

# 反筛选,筛选除了Sepal.Length变量的其它变量

iris %>% select(-Sepal.Length) %>%head()

# 将变量Species移动到最后面

iris %>% select(everything(), Species) %>% head()

iris %>% select(-Species, Species) %>% head()

# 错误的用法,结果为空

iris %>% select(Species, -Species) %>% head()

iris %>% select(contains("etal")) %>% head()

iris %>% select(matches(".t.")) %>% head() # 筛选名称中,t在中间的变量。

iris %>% select(last_col()) %>% head()# 最后一个变量

iris %>% select(last_col(offset = 2)) %>% head() # 倒数第3个变量

iris %>% select(one_of(c("Petal.Length", "Petal.Width"))) %>% head()

iris %>% group_by(Species) %>% select(group_cols()) %>% distinct() %>% head() # 获取分组变量名

df % as_tibble()

head(df)

df %>% select(V4:V7) %>% head() # 筛选V4列到V7列

df %>% select(num_range("V", 4:7)) %>% head() # 结果与前面一样

#列名重命名

iris %>% select(petal_length = Petal.Length) %>% head() # 重命名

iris %>% select(obs = starts_with('S')) %>% head() # 多个变量重命名

更多生物信息课程:

1. 文章越来越难发?是你没发现新思路,基因家族分析发2-4分文章简单快速,学习链接:基因家族分析实操课程、基因家族文献思路解读

2. 转录组数据理解不深入?图表看不懂?点击链接学习深入解读数据结果文件,学习链接:转录组(有参)结果解读;转录组(无参)结果解读

3. 转录组数据深入挖掘技能-WGCNA,提升你的文章档次,学习链接:WGCNA-加权基因共表达网络分析

9.组学大讲堂全部生物生信数据挖掘课程可点击:组学大讲堂视频课程

r语言中mpg数据_R语言数据筛选整理包dplyr相关推荐

  1. R语言中dim函数_R语言中的方差分析方法汇总

    方差分析,是统计中的基础分析方法,也是我们在分析数据时经常使用的方法.下面我总结一下R语言如何对常用的方差分析进行操作. 1. 方差分析的假定 上面这个思维导图,也可以看出,方差分析有三大假定:正态, ...

  2. R语言中dim函数_R语言--向量化计算(apply族函数)

    R语言最优秀的是它的向量化编程,这其中apply族函数扮演了非常重要的角色.apply族函数是由apply.sapply.lapply.mapply.tapply等函数组成的.熟练使用apply族函数 ...

  3. R语言中dim函数_R语言 常见函数知识点梳理与解析 | 精选分析

    目 录 1.str() 显示数据集和变量类型,并简要展示数据集情况 2.subset()  取子集 3.which.min(), which.max()和which() 4.pmin( )/ pmax ...

  4. r语言中paste函数_R中的paste()函数-简要指南

    r语言中paste函数 Using the paste() function in R will be straight and simple. In this tutorial let's see ...

  5. r语言中mpg数据_R语言常用的数据处理的包(1)

    在R中有很多的内置函数,比如transform().rbind().cbind()等函数,这些函数我们可以直接使用,除此之外,还有常见的几种包在处理数据的时候非常好用. dplyr包 dplyr包是H ...

  6. r语言中mpg数据_R语言数据实战 | 统计检验

    原标题:R语言数据实战 | 统计检验 1.单个总体均值的t检验 1. 什么是检验? 检验(test)是统计学中最重要的概念之一,在科学研究和实际业务中都有着广泛的应用.用一句话来概括就是:人们希望通过 ...

  7. r语言中mpg数据_零基础生信入门第一课——R语言数据清洗,超详细讲解,建议收藏!...

    小伙伴们大家好!今天我要用一篇推文精要概括数据清洗中的最基本最关键的步骤,对于零基础的学员一定会有很大收获!数据清洗是完成一篇生信文章最基本但也是最终要的准备工作,如果不会数据清洗,就要错过很多优质数 ...

  8. r语言 整理、处理数据步骤_R语言万能数据清洗整理包Tidyverse(一)

    数据整理和清洗是任何统计分析的前提,也是最为困难的一个环节,很多软件也提供了数据整理和清洗的功能.甚至连我们常用的EXCEL也可以做这个工作,但是效率很低,而且容易出错,且无法完整保存清洗过程.R语言 ...

  9. r语言中mpg数据_R语言数据分析系列之五

    R语言数据分析系列之五 本节来讨论一下R语言的基本图形展示,先来看一张效果图吧. 这是一张用R语言生成的,虚拟的wordcloud云图,详细实现细节请參见我的github项目:https://gith ...

最新文章

  1. Java培训都学什么
  2. Android开发之百度地图经纬度转换地址(以及获取详细地址的方法自测成功)
  3. VS Code 变身约会利器!以码会友,轻松找到心仪的TA!
  4. java中死锁_关于java中死锁的总结
  5. python table_用python解析word文件(二):table
  6. 内存的工作原里(二)
  7. 家卫士扫地机器人好吗_2020年扫地机器人推荐选购指南(扫地机器人实用吗?国内扫地机器人哪个牌子好?)...
  8. cte sql_为什么我的CTE这么慢?
  9. Canvas实现简单刮刮乐效果
  10. Mysql使用dos命令安装
  11. R语言source命令使用过程中遇到的某些错误的解决方法
  12. 2020 IJCAI 接受论文 list 分类排列(二)
  13. 清华生的多年奋斗领悟
  14. 介值定理究竟在讲什么?
  15. 银河麒麟高级服务器部署glusterfs
  16. Clippper模拟量输出设置
  17. Jordan CP3 11 Performance Reviews
  18. 华为云大数据平台,助力企业数字化转型成效明显
  19. 【记忆化搜索】 hdu2452 Navy maneuvers
  20. CityEngine2019 学习笔记 (1)一 基本操作

热门文章

  1. 把数据转换为在内存中Tree(树形结构)。_Linux的中断处理机制 [二] - 数据结构(2)...
  2. zlib和openssl相关库错误的解决
  3. python数组每个元素加1_python-根据键转换numpy数组中的每个元素
  4. python设置背景音乐_python给视频添加背景音乐并改变音量的具体方法
  5. php 數組重組,php數組的重組及多級下拉菜單
  6. mysql的count()函数如何选择索引,千万级表的count()查询优化实例
  7. java并发实战看不懂,附带学习经验
  8. 【深度学习】像素级分割网络新思路之DeepLabv3+
  9. 【Network Security!】xrdp+vnc4server+xfce4远程管理Ubuntu服务器桌面
  10. python【蓝桥杯vip练习题库】ADV-120 6-17复数四则运算