▶️ 查看代码
company revenue cost rating
1 锦城科技 1200 800 A
2 蜀汉制造 980 650 B
3 天府物流 1560 1020 A
4 青羊金融 760 500 C
5 锦江生物 2100 1400 A
6 浣花实业 891 600 B
数据分析与R语言
2026年09月22日
Data Wrangling with dplyr
今天是项目二“数据准备”第二课,数据沿用第 7 课那套(一键复现)。
复习一下第6、7课的内容,热热身
base R筛选数据框够直观吗?
第7课学的四个类型转换函数还记得几个?(as.numeric() / as.character() / as.factor() / as.Date())
回顾第2课的向量筛选:revenue[revenue > 130]——这是对一列数字做筛选。
但如果是一个完整的数据框(company_data,含公司名、营收、评级多列),想“筛选出营收超过1000亿元的公司,只看公司名和评级两列,并按营收从高到低排序”——第6课的df[df$revenue > 500, ]能做,但写起来比较绕。
dplyr 是 tidyverse 的核心包,提供一套“动词”函数:arrange()排序、filter()筛选行、select()选列、mutate()新增列、summarise()汇总(后两个下节课学)——:把 base R 的“手动挡”升级成 dplyr 的“自动挡”。
本讲全程用这份虚构财务数据(锦城科技系列)——先跑一遍。
company revenue cost rating
1 锦城科技 1200 800 A
2 蜀汉制造 980 650 B
3 天府物流 1560 1020 A
4 青羊金融 760 500 C
5 锦江生物 2100 1400 A
6 浣花实业 891 600 B
管道符是 dplyr 工作流的“粘合剂”
提示
x %>% f() 等价于 f(x);x %>% f(y) 等价于 f(x, y)——管道符把左边的结果,作为右边函数的第一个参数传进去。
%>%(magrittr 提供、dplyr 自动加载)。R 4.1+ 另有一个原生管道 |>,但部分学校机房的 R 版本较低、不支持 |>,所以我们一律用 %>%
把 round(sqrt(15)) 改写成管道形式(提示:从最里层的 sqrt(15) 开始往外“传”)
arrange() 让数据框按某一列或几列的值重新排队
不写任何修饰就是从低到高——第一行是营收最低的青羊金融(760.2)。
arrange() 默认是升序——很多同学第一反应以为是降序;想从高到低,一定要加 desc()。
多列排序时,条件从左到右依次作为主关键字、次关键字——先按评级分组,同一评级内再按营收从高到低排。
arrange() 对 R 内置数据集 mtcars 按 mpg(每加仑英里数)从高到低排序。arrange() 对 R 内置数据集 iris 先按 Species 排序,同一物种内再按 Sepal.Length 从高到低排序。filter() 是 dplyr 里使用频率最高的函数
筛选逻辑和前面学的向量筛选一样,只是把对象从“一列数字”换成了“整个数据框”,条件写在逗号后面的参数里
company revenue cost rating
1 锦城科技 1200 800 A
2 天府物流 1560 1020 A
3 锦江生物 2100 1400 A
company revenue cost rating
1 锦城科技 1200 800 A
2 蜀汉制造 980 650 B
3 天府物流 1560 1020 A
4 锦江生物 2100 1400 A
5 浣花实业 891 600 B
用 R 内置数据集 airquality(1973年纽约每日空气质量观测)完成:
Temp(华氏温度)大于90的记录(单条件)Month 等于7 且 Temp 大于85的记录(双条件“且”)Month 等于6 或 Month 等于9的记录(双条件“或”)选列,为数据“瘦身”
财务场景:原始数据常有几十列,某次分析只需要其中几列——select() 能快速给数据“瘦身”。
列多的时候,用 - 比把要保留的列名一个个列出来省事,也不怕漏列。
用 R 内置数据集 mtcars 完成:
mpg、cyl、hp 三列(正向选择)vs 和 am 两列,保留其余所有列(排除选择)gear、mpg、hp,其余列放最后(用 everything())用一条管道完成:筛选出评级为A的公司 → 按营收从高到低排序 → 只保留公司名和营收两列
把今天学的动词串成一条连贯的流水线
模拟一份真实的财务分析任务:从 company_data 出发,完成——
write_csv() 导出结果(回顾第7课的导出)提示
建议先用管道写一个“一气呵成”的版本,再用 base R 写一遍同样逻辑,对比两者的可读性。
每一步一个“动词”,代码本身就是操作说明书——这正是“代码即流程”的体现
现场邀请1-2名学生展示自己的管道写法与 base R 写法的对比
“动词化”的数据处理思维
flowchart LR
A["管道符<br/>把步骤串起来"] --> B["arrange()<br/>排序"]
B --> C["filter()<br/>筛选行"]
C --> D["select()<br/>选列瘦身"]
D --> E["综合实战<br/>一条流水线"]
style A fill:#1a3a5c,color:#fff
style B fill:#2e5984,color:#fff
style C fill:#7a4419,color:#fff
style D fill:#375623,color:#fff
style E fill:#6b3d8f,color:#fff
管道符(%>%)把数据传下去,arrange() 排序、filter() 筛选行、select() 选列——这就是 dplyr“动词化”工作的核心范式:数据从左流到右,每一步做什么清清楚楚
对照一下,今天这几件事你都做到了吗?
%>% 把多个处理步骤串起来arrange() 排序(记得 desc() 降序)filter() 做单条件与多条件(&、|、%in%)筛选select() 选择、排除列或调整列顺序提示
如果有没打勾的,下课后一定要找同学或老师补上,不要留到下一讲。
请花1分钟,在纸条或在线问卷上简要回答:
%>% 改变了代码的“阅读方向”,具体是怎么变的?arrange() 默认是升序还是降序?想要降序要加什么?filter() 里 & 和 | 有什么区别?什么时候用 %in% 更合适?本次作业以《实验报告3》的形式布置,共8道题,全部基于R自带的 mtcars 数据集,无需读取任何外部文件:
select()、filter()、arrange() 三个动词)提交要求
按《实验报告3》模板要求,在“实现代码”处和“效果截图”处粘贴运行结果截图,完成后提交该Word文档。
第9讲:数据变换与汇总——mutate()新增/修改列、group_by()分组、summarise()汇总统计
mutate():新增或修改列group_by() + summarise():分组汇总统计提示
课前准备:保留好今天写的筛选排序代码,下节课会在这个基础上继续添加新的处理步骤。
第8讲:dplyr筛选与排序
"Good data analysis is about clear communication." 数据处理的每一步都应当清晰可读、有据可查——就像审计工作底稿逐步留痕。
朱 奇 | 锦城大学 · 财会学院