library(nycflights13)library(tidyverse)flights
您可能会注意到,此数据框打印的内容与您过去可能使用的其他数据框略有不同:它只显示适合一个屏幕的前几行和所有列。(要查看整个数据集,可以运行View(flights),这将在RStudio查看器中打开数据集。)。它的打印方式不同,因为它是tibble的。tibble也是数据框,但稍微进行了调整,以便在整齐的格式中更好地工作。您可能还注意到列名下面一行三个(或四个)字母的缩写。它们描述了每个变量的类型:int:代表整数。dbl:代表双精度,或实数。chr:代表字符向量或字符串。dttm:代表日期-时间(日期+时间)。lgl:代表只包含TRUE或FALSE的逻辑向量。fctr:代表因子,R用它来表示具有固定可能值的分类变量。date:代表日期。dplyr基础在本文章中,您将学习能解决绝大多数数据操作挑战的五个关键dplyr函数:根据观测值选择观测值(filter())。重新排序行(arrange())。按名称选择变量(select())。使用现有变量的函数创建新变量(mutate())。将多个值折叠为单个摘要(summarize())。这些都可以与group_by()结合使用,后者将每个函数的作用域从操作整个数据集更改为逐个组操作。这六个函数为数据操作语言提供了动词。所有动词的工作方式都相似:1.第一个参数是数据框。2.后续参数使用变量名(不带引号)描述如何处理数据框。3.结果是一个新的数据框。将这些属性结合在一起,可以轻松地将多个简单步骤链接在一起,以实现复杂的结果。让我们深入研究一下这些动词是如何工作的。使用filter()筛选行filter()允许您根据它们的值设置观测值的子集。第一个参数是数据框的名称。第二个和后续参数是筛选数据框的表达式。例如,我们可以使用以下命令选择1月1日的所有航班:filter(flights, month == 1, day == 1)
可以将筛选结果赋值给变量:jan1 <- filter(flights, month == 1, day == 1)
也可以在赋值的同时打印筛选结果:(dec25 <- filter(flights, month == 12, day == 25))
可以通过比较运算符(>, >=, <, <=, != , ==)以及逻辑运算符(&, |, !)设置复杂的筛选条件:filter(flights, month == 11 | month == 12)nov_dec <- filter(flights, month %in% c(11, 12))filter(flights, !(arr_delay > 120 | dep_delay > 120))filter(flights, arr_delay <= 120, dep_delay <= 120)
使用arrange()排列行arrange()的工作方式类似于filter(),不同之处在于它不是选择行,而是更改它们的顺序。它需要一个数据框和一组列名(或更复杂的表达式)来排序。如果提供多个列名,则每个额外的列都将用于打破前面列的值的关联:arrange(flights, year, month, day)
使用desc()按列降序重新排序:arrange(flights, desc(arr_delay))
注意,缺少的值始终在排序列的末尾。使用select()选择列获得包含数百甚至数千个变量的数据集的情况并不少见。在这种情况下,第一个挑战通常是缩小您实际感兴趣的变量的范围。select()允许您使用基于变量名称的操作快速放大有用的子集。select()对飞行数据并不是特别有用,因为我们只有19个变量,但是您仍然可以了解大致情况:# Select columns by nameselect(flights, year, month, day)
# Select all columns except those from year to day (inclusive)select(flights, -(year:day))
您可以在select()中使用许多帮助函数:starts_with("abc"):匹配以“abc”开头的名称。ends_with("xyz"):匹配以“xyz”结尾的名称。contains("ijk"):匹配包含“ijk”的名称。matches("(.)\\1"):选择与正则表达式匹配的变量。此参数匹配任何包含重复字符的变量。num_range("x", 1:3):匹配x1、x2和x3。请?select选择以了解更多详细信息。select()可用于重命名变量,但很少会这样用,因为它会删除所有未明确提到的变量。相反,可以使用rename(),它是select()的变体,它保留所有未明确提到的变量:rename(flights, tail_num = tailnum)
另一种选择是将select()与everything()帮助器结合使用。如果您有几个要移动到数据框开头的变量,这将非常有用:select(flights, time_hour, air_time, everything())
使用mutate()添加新变量除了选择现有列的集合之外,也有必要添加新列,通常可以用现有列的函数转换得到。这就是mutate()的工作。mutate()总是在数据集的末尾添加新列,因此我们将从创建一个更窄的数据集开始,这样我们就可以看到新的变量。请记住,当您在RStudio中时,查看所有列的最简单方法是View():flights_sml <- select(flights, year:day, ends_with("delay"), distance, air_time)mutate(flights_sml, gain = arr_delay - dep_delay, speed = distance / air_time 60)
请注意,您可以引用刚刚创建的列:mutate(flights_sml, gain = arr_delay - dep_delay, hours = air_time / 60, gain_per_hour = gain / hours)
如果只想保留新变量,请使用transmute():transmute(flights, gain = arr_delay - dep_delay, hours = air_time / 60, gain_per_hour = gain / hours)
有用的创建函数有许多用于创建新变量的函数,您可以将它们与mutate()一起使用。关键属性是函数必须向量化:它必须将值的向量作为输入,并返回具有与输出相同数量的值的向量。没有办法列出您可能使用的每一个可能的函数,但以下是一些经常有用的函数:算数运算符 +, -, , /, ^模算术 (%/% and %%),%/%(整数除法)和%%(余数)对数 log(), log2(), log10()偏移 lead()和lag() 允许您引用超前值或滞后值。这允许您计算运行差异(例如,x - lag(x))或查找值何时更改(x != lag(x))。它们与group_by()配合使用最为有用,您很快就会了解到这一点:(x <- 1:10)lag(x)lead(x)
累积和滚动汇总R提供用于运行总和,乘积,最小值和最大值:cumsum(),cumprod(),cummin(),cummax(); dplyr提供cummean()以获得累积平均值。如果您需要滚动汇总(即,通过滚动窗口计算得出的总和),请尝试RcppRoll软件包:xcumsum(x)cummean(x)
逻辑比较 <, <=, >, >=, !=如果您正在执行复杂的逻辑操作序列,那么将临时值存储在新变量中通常是个好主意,这样您就可以检查每个步骤是否按预期工作。排名 有很多排名函数,但您应该从min_rank()开始。它执行最常见类型的排名(例如,第一、第二、第三、第四)。默认值为最小的值提供最小的排名;使用desc(x)为最大的值提供最小的排名:y <- c(1, 2, 2, NA, 3, 4)min_rank(y)min_rank(desc(y))
如果min_rank()没有执行所需的操作,请查看变体row_number(),dense_rank(),percent_rank(),cume_dist()和ntile()。有关更多详细信息,请参阅他们的帮助页面:y <- c(1, 2, 2, NA, 3, 4)row_number(y)dense_rank(y)percent_rank(y)cume_dist(y)
使用summarize()实现分组摘要最后一个关键动词是summarize()。它将数据框折叠为单行:summarize(flights, delay = mean(dep_delay, na.rm = TRUE))
除非我们将其与group_by()配对,否则summarize()并不是非常有用。这会将分析单位从完整的数据集更改为单独的组。然后,当您在分组的数据框上使用dplyr动词时,它们将自动“按组”应用。例如,如果我们对按日期分组的数据框应用完全相同的代码,则会得到每个日期的平均延迟:by_day <- group_by(flights, year, month, day)summarize(by_day, delay = mean(dep_delay, na.rm = TRUE))
group_by()和summarize()一起提供了在使用dplyr时最常用的工具之一:分组摘要(grouped summary)。但在dplyr最强大的功能还是体现在管道操作。这就是下一篇的重点了。欢迎继续关注我的作品。请点赞!(图片来源网络,侵删)
0 评论