第三章 使用dplyr进行数据转换

加载 tidyverse 时,仔细查看输出的冲突信息,它会告诉你 dplyr 覆盖了基础 R 包中的哪些函数。如果想要在加载 dplyr 后使用这些函数的基础版本,那么你应该使用它们的完整名称: stats::filter() 和 stats::lag()。
• int 表示整数型变量。
• dbl 表示双精度浮点数型变量,或称实数。
• chr 表示字符向量,或称字符串。
• dttm 表示日期时间(日期 + 时间)型变量。
• lgl 表示逻辑型变量,是一个仅包括 TRUE 和 FALSE 的向量。
• fctr 表示因子, R 用其来表示具有固定数目的值的分类变量。
• date 表示日期型变量。
dplyr基础
5 个 dplyr 核心函数:
• 按值筛选观测(filter())。
• 对行进行重新排序(arrange())。
• 按名称选取变量(select())。
• 使用现有变量的函数创建新变量(mutate())。
• 将多个值总结为一个摘要统计量(summarize())。
5 个函数的工作方式都是相同的:
(1) 第一个参数是一个数据框。
(2) 随后的参数使用变量名称(不带引号)描述了在数据框上进行的操作。
(3) 输出结果是一个新数据框。
这些函数都可以和 group_by() 函数联合起来使用, group_by() 函数可以改变以上每个函数的作用范围,让其从在整个数据集上操作变为在每个分组上分别操作。
使用filter()筛选行
filter() 函数可以基于观测的值筛选出一个观测子集。第一个参数是数据框名称,第二个参数以及随后的参数是用来筛选数据框的表达式。


比较运算符
比较运算符: >、 >=、 <、 <=、 !=(不等于)和 ==(等于)。
比较浮点数是否相等时,不能使用 ==,而应该使用 near():


逻辑运算符
布尔运算符: & 表示“与”、 | 表示“或”、 ! 表示“非”:



缺失值
确定一个值是否为缺失值,可以使用 is.na() 函数:


filter() 只能筛选出条件为 TRUE 的行;它会排除那些条件为 FALSE 和 NA 的行:


使用arrange()排列行
arrange() 函数的工作方式与 filter() 函数非常相似,但前者不是选择行,而是改变行的顺序。它接受一个数据框和一组作为排序依据的列名(或者更复杂的表达式)作为参数。如果列名不只一个,那么就使用后面的列在前面排序的基础上继续排序,注:默认缺失值排在最后。


使用 desc() 可以按列进行降序排序:


使用select()选择列
select()可以用于选择自己需要的列作为子集,然后用于分析:




select () 函数的一些辅助函数:
• starts_with("abc"):匹配以“abc”开头的名称。
• ends_with("xyz"):匹配以“xyz”结尾的名称。
• contains("ijk"):匹配包含“ijk”的名称。
• matches("(.)\1"):选择匹配正则表达式的那些变量。这个正则表达式会匹配名称中有
重复字符的变量。你将在第 10 章中学习到更多关于正则表达式的知识。
• num_range("x", 1:3):匹配 x1、 x2 和 x3。
select() 可以重命名变量,但我们很少这样使用它,因为这样会丢掉所有未明确提及的变量。我们应该使用 select() 函数的变体 rename() 函数来重命名变量,以保留所有未明确提及的变量:


select() 函数和 everything() 辅助函数结合起来使用。可以将几个变量移到数据框开头时,这种用法非常奏效:


使用mutate()添加新变量
mutate()函数可用于添加新的列。
.after = X 添加在X列的后面 .before = Y 添加在Y列的前面


如果只想保留新变量,可以使用 transmute() 函数:


常用创建函数
算术运算符: +、 -、 *、 /、 ^


模运算符: %/% 和 %%


对数函数: log()、 log2() 和 log10()
偏移函数:lead() 和 lag() 函数可以返回一个序列的领先值和滞后值。


累加和滚动聚合:R 提供了计算累加和、累加积、累加最小值和累加最大值的函数: cumsum()、 cumprod()、commin() 和 cummax(); dplyr 还提供了 cummean() 函数以计算累加均值。如果想要计算滚动聚合(即滚动窗口求和),那么可以尝试使用 RcppRoll 包:


逻辑比较: <、 <=、 >、 >= 和 !=


使用summarize()进行分组摘要
查看数据摘要。
使用管道组合多种操作
管道命令: %>%,使用这种方法时, x %>% f(y) 会转换为 f(x, y), x %>% f(y) %>% g(z) 会转换为 g(f(x,y), z),以此类推。



等价于

缺失值
na.rm = TRUE表示移除缺失值。


计数
n()函数表示计数。
常用的摘要函数
位置度量:median(x)中位值
分散程度度量: sd(x)、 IQR(x) 和 mad(x)。均方误差(又称标准误差, standard deviation, sd)是分散程度的标准度量方式。四分位距 IQR() 和绝对中位差 mad(x) 基本等价。
秩的度量: min(x)、 quantile(x, 0.25) 和 max(x)。quantile(x, 0.25) 会找出 x 中按从小到大顺序大于前25% 而小于后 75% 的值。
定位度量: first(x)、 nth(x, 2) 和 last(x)。这几个函数的作用与 x[1]、 x[2] 和 x[length(x)] 相同,只是当定位不存在时(比如尝试从只有两个元素的分组中得到第三个元素),前者允许你设置一个默认值。
计数:n(),sum(!is.na(x))可以计算出非缺失值的数量,n_distinct(x)可以计算出唯一值的数量。
逻辑值的计数和比例: sum(x > 10) 和 mean(y == 0)。当与数值型函数一同使用时, TRUE 会转换为 1, FALSE 会转换为 0。
按多个变量分组
当使用多个变量进行分组时,每次的摘要统计会用掉一个分组变量。



取消分组
如果想要取消分组,并回到未分组的数据继续操作,那么可以使用 ungroup() 函数:


分组新变量(和筛选器)
分组筛选器的作用相当于分组新变量加上未分组筛选器。


附:dplry深度学习
筛选:filter
filter()函数k可以按照给定的逻辑条件筛选出符合要求的子数据集,返回与输入数据相同的数据类型,支持对同一对象的任意条件组合。
语法:
filter(data,条件)





排序:arrange
arrange()函数按照给定的列对数据进行排序,默认是按照升序排序,也可以使用desc()实现降序排序。可以对多个列进行排序,用逗号分隔。
语法:
arrange(data,col_name)



选择:select
select()按照列名选择子数据集,可以结合特定函数使用:
ends_with():选择以指定字符结尾的列
starts_with():选择以指定字符开头的列
contains():选择包含指定字符的列
one_of():选择列名为指定字符的列
num_range():选择组合字符指定的列
everything():选择所有的列,一般不用于选择,而是用于修改列的顺序
语法:
select(data,col_names)







重命名:rename
rename()函数的使用方法和select一样,唯一不同的是rename()函数可以对列进行重命名后返回的是全部列,而不是只返回重命名的列。
语法:
rename(data,new_name=old_name)


变形:mutate
mutate()函数可以对已有的列进行数据运算并添加为新的列,mutate的结果会保留原有变量。
语法:
mutate(data,…)


去重:distinct
distinct()用于对输入的数据进行去重,返回无重复的行。
语法:
distinct(.data, ..., .keep_all = FALSE)



概要:summarise
sunmmarise()可以对数据框进行汇总操作,返回一维结果。
语法:
summarise(.data, ...)
summarise主要支持以下几种公式 :
mean()、 median()
sd()、 IQR()、 mad()
min()、 max()、 quantile()
first()、 last()、 nth()
n()、 n_distinct()
any()、 all()


抽样:sample
用于对数据进行抽样的函数,sample_n()抽取指定数量的样本,sample_frac()抽取指定百分比的样本,默认为不放回抽样,可以通过设置replacement=TRUE改为放回抽样。
语法:
sample_n(tbl, size, replace = FALSE, weight = NULL, .env = parent.frame())
sample_frac(tbl, size = 1, replace = FALSE, weight = NULL,.env = parent.frame())








分组:group_by
group_by()用于对数据集按照给定变量分组,返回分组后的数据集,使用以上的函数对分组数据进行操作时,会自动对分组数据进行操作。
语法:
group_by(data, ..., add = FALSE)










条件语句:ifelse
语法:
if_else(condition,true, false, missing = NULL)



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容