利用dplyr包中的函数可以更高效的进行数据清洗、数据分析以及为后续数据建模创造环境,今天就给大家写一写dplyr包的常用方法,掌握这些方法基本上就可以处理大部分数据了,包括:
- Pick observations by their values (filter()).
- Reorder the rows (arrange()).
- Pick variables by their names (select()).
- Create new variables with functions of existing variables (mutate()).
- Collapse many values down to a single summary (summarise()).
本文将使用dplyr包中的飞机航班数据作为例子中的示例数据,大家可以用?flights看一看数据集中每一个变量的含义,这儿我就不写了,因为本文会很长,重点写用法。
数据筛选函数filter()
可使用filter()函数筛选/查找特定条件的行,filter() 按照指定的条件筛选符合条件中逻辑判断要求的数据记录,返回行的子集,这个filter()的第一个参数是数据,后面的参数是条件,比如说我想筛选出数据集中所有的一月一日的航班,就可以用如下代码:
filter(flights, month == 1, day == 1)
筛选的时候条件的写法又有很多种,常见的& is “and”, | is “or”, and ! is “not”,还有x %in% y
在写条件的时候,可以选择自己,很好用,比如我想选出所有的十一月和十二月的航班,可以用如下代码:
(nov_dec <- filter(flights, month %in% c(11, 12)))#外面加上括号会自动显示出nov_dec的内容
行重排arrange()
arrange()根据一个或多个变量对行排序,默认为升序排列,也可以对列名加desc()进行降序排序。arrange()的第一个参数依旧是数据集,后面的参数为要排序的列名,比如,我现在对数据集以年月日进行升序排列,代码如下:
arrange(flights, year, month, day)
再比如,我现在以飞机起飞时的延迟时间进行降序排列,代码如下:
arrange(flights, desc(dep_delay))
需要特别注意的是:无论降序还是升序,缺失值永远排在最后。
选择变量select()
很多时候我们只需要分析数据库中的部分变量,这个时候就可以用select()在数据集中进行变量筛选。
比如,我现在只想要数据集中的year, month, day三个变量,可以用如下代码:
select(flights, year, month, day)
select(flights, year:day)#连续选择
如果我们需要的变量很多,还可以用反选操作,如下可以选择出除了year, month, day的所有变量。
select(flights, -(year:day))
在select()中选择变量,还有很多辅助函数可以用:
- starts_with("X"): 以 "X"开头的变量名
- ends_with("X"): 以 "X"结束的变量名
- contains("X"): 包含 "X"的变量名
- matches("X"): 匹配正则表达式“x"的变量名
- num_range("x", 1:5): 变量名为 x01, x02, x03, x04 and x05
- one_of(x): 出现在字符向量x中的所有变量名
- everything(): 选择所有变量,一般调整数据集中变量顺序时使用
在select()中直接使用列时不需要引用"",但使用上述辅助函数时必须引用""。
变量变换/重构mutate()
mutate函数可以基于原始变量重新计算得到新的变量,或重写已经存在的数据列,在做数据分析预处理的时候经常会用到该功能。
例如,下面的代码会重新计算出2个新的变量gain和speed。
flights_sml <- select(flights,
year:day,
ends_with("delay"),
distance,
air_time
)
mutate(flights_sml,
gain = dep_delay - arr_delay,
speed = distance / air_time * 60
)
同样可以进行数据扩展的还有transmute()函数,与mutate()函数不同的是,该函数扩展新变量的同时,将删除所有原始变量。
在变量重构的时候有一些小方法不得不提:比如将整数分拆需要用到的%/% (integer division) and %% (remainder);变量变换需要用到的log(), log2(), log10();累计函数:cumsum(), cumprod(), cummin(), cummax(),cummean()等等,大家可以试试用这些方法得到新的变量。
分组总结summarise()
summarize函数实现对数据的汇总,比如求和、计算平均值等。
还可以结合group_by()函数实现分组聚合(最常用),单独对每个分组进行聚合运算。
比如我现在想要计算每一天所有飞机的的平均起飞延迟,可以用如下代码:
by_day <- group_by(flights, year, month, day)
summarise(by_day, delay = mean(dep_delay, na.rm = TRUE))
summarise()和group_by()结合非常常用
这个例子介绍了summarise()中求平均的mean用法,还有很多可以用在summarise()中的函数,如下:
- min():返回最小值
- max():返回最大值
- mean():返回均值
- sum():返回总和
- sd():返回标准差
- var():方差
- diff(range()):x值的范围
- median():返回中位数
- quantile(x, p):x的第P个分位数
- IQR():返回四分位极差
- n():返回观测个数
- n_distinct():统计数据集中无重复值的数量
- first():返回第一个观测
- last():返回最后一个观测
- nth():返回n个观测
pipe%>%管道函数
在介绍summarise()的时候不得不提管道函数。想象一下,我现在想要探讨不同地点距离和平均延误时间的关系,我正常来说会写出如下的代码:
by_dest <- group_by(flights, dest)
delay <- summarise(by_dest,
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
)
delay <- filter(delay, count > 20, dest != "HNL")
ggplot(data = delay, mapping = aes(x = dist, y = delay)) +
geom_point(aes(size = count), alpha = 1/3) +
geom_smooth(se = FALSE)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
分析一下上面的代码:首先将数据以目的地进行分组形成对象by_dest,然后对对象by_dest进行总结形成了count、dist、delay三个对象,然后以条件count > 20, dest != "HNL"进行了筛选,形成了最终的delay对象。然后对delay对象进行了作图。
以上的做法其实是有点繁琐的,在于每次生成的中间变量比如by_dest,我们都需要给它起个名字,其实起名字有时候很麻烦的,尤其是这个中间变量我们之后都不会再用。
所以说,我们需要一种更加简单的方法来写上面的代码,这段代码就会用到pipe%>%
delays <- flights %>%
group_by(dest) %>%
summarise(
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
) %>%
filter(count > 20, dest != "HNL")
上面的代码的优势就在于,整个过程聚焦于数据转换的过程而非转换过程中形成了哪些对象,这些对象又叫什么名字,使用管道函数可以大大增加代码的简洁性和可读性。
小结
今天给大家写了dplyr包的常见用法,这个包是数据分析绕不过的一个好包,同时还给大家介绍了管道函数,感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么基础没有从零学Python和R的,加油。
(站外链接发不了,请关注后私信回复“数据链接”获取本头条号所有使用数据)