[1] 120 128 135 150
[1] 150 135 128 120
第6讲:数据管理基础——排序、合并、分组统计与简单数据读写
2026年09月16日
Data Management Basics
提示
今天是项目一"R语言基础"的最后一课。把数据管理的基础工具补齐,也为下周开始的项目二"数据准备"(用dplyr/tidyr专业工具)做好衔接。
温故知新,为今天的内容热热身
请在正式上课前,凭记忆快速完成下面4道题(不查资料):
选择题2:下面哪一个是自定义函数正确的"三段式结构"?
A. 函数名 <- function(参数) { 函数体 } B. function(参数) <- 函数名 { 函数体 }
C. 函数体 <- function(函数名) { 参数 } D. 参数 <- function(函数体) { 函数名 }
填空题1:向量x <- c(10, 20, 30),取出第2个元素的写法是x[____]。
填空题2:判断一个对象是不是数据框,可以用is.____()函数。
提示
这4道题分别复习了矩阵(第4课)、自定义函数(第5课)和向量索引(第2课),都是今天"排序""合并""分组统计"要用到的基本功。
项目一学的知识够用了吗?
自定义函数的三段式结构是什么?请举例说明(回顾第5课)
问题一:3家公司的营收数据(第4课学的矩阵),如果想按营收从高到低排序展示,怎么做?
问题二:如果想把"3家公司Q1-Q2数据"和"3家公司Q3-Q4数据"两张表合并成一张完整表,怎么做?
问题三:如果想统计"不同评级(A/B/C)的公司各有几家、平均营收各是多少",怎么做?
问题四:如果这些数据存在一个CSV格式的文件里,怎么读进R里来、处理数据后怎么保存?
order()与sort()
[1] 3 4 2 1
[1] "泸州老窖" "洋河股份" "五粮液" "贵州茅台"
[1] "贵州茅台" "五粮液" "洋河股份" "泸州老窖"
课堂练习:给定四家公司的评级(因子)和营收(向量),用order()按营收从高到低,同时排出对应的评级
rbind()/cbind()/merge()
警告
cbind()要求两边行数一致、公司顺序也一致才能正确对应——这是新手最容易踩的坑:如果两张表里公司的先后顺序不一样,合并出来的数据会"张冠李戴",财务分析中这种错误可能非常隐蔽且后果严重。
company revenue rating
1 五粮液 680 A
2 贵州茅台 1500 A
company revenue rating
1 五粮液 680 A
2 泸州老窖 320 <NA>
3 洋河股份 NA B
4 贵州茅台 1500 A
company revenue region
1 五粮液 680 四川
2 泸州老窖 320 四川
3 贵州茅台 1500 贵州
company revenue rating
1 五粮液 680 A
2 贵州茅台 1500 A
注记
merge()默认会自动找两个数据框里"名字相同"的列作为合并依据;但财务数据经常出现"公司""company""name"这类字段名不统一的情况,这时必须用by.x(左表的关键列名)和by.y(右表的关键列名)显式告诉R"按哪一列对应哪一列"合并。哪怕两表关键列名字相同,显式写出by = "列名"也是更严谨、更易读的好习惯。
课堂练习:
公司名字段叫name而不是company,请用merge()把df1和df4按"公司名"正确合并
table()与tapply()
复习第2课因子部分:
company rating revenue
1 贵州茅台 A 1500
2 五粮液 B 680
3 泸州老窖 A 320
4 洋河股份 C 450
5 古井贡酒 B 210
6 舍得酒业 A 180
注记
tapply(要汇总的数据, 分组依据, 汇总函数)——这是base R做"分组统计"最核心的函数,虽然项目二会学更好用的group_by()+summarise(),但"分组→汇总"这套逻辑是相通的。
财务场景练习:用tapply()分别算出每个评级公司的最高营收和最低营收(提示:把sum换成max或min)
read.csv()/write.csv()
row.names=FALSE:不把R自动生成的行号也写进CSV,这是一个容易被忽略但很重要的细节
company revenue rating
1 贵州茅台 1500 A
2 五粮液 680 B
3 泸州老窖 320 A
4 洋河股份 450 C
5 古井贡酒 210 B
6 舍得酒业 180 A
'data.frame': 6 obs. of 3 variables:
$ company: chr "贵州茅台" "五粮液" "泸州老窖" "洋河股份" ...
$ revenue: int 1500 680 320 450 210 180
$ rating : chr "A" "B" "A" "C" ...
注记
这里只是最简单的"能读能写"体验,目的是建立直观印象;真正系统的数据导入导出(不同编码、不同分隔符、Excel/SPSS等更多格式)将在下周项目二"数据准备"中用readr、readxl等专业包系统学习,今天不做深入展开。
把这节课创建的company/revenue/rating数据框写出为一个CSV文件,再读回来,用str()验证内容与结构是否一致
六次课串成一张地图
flowchart LR
L1["第1课<br/>环境搭建·基础运算"] --> L2["第2课<br/>数据类型·核心对象"]
L2 --> L3["第3课<br/>Markdown·Quarto"]
L3 --> L4["第4课<br/>矩阵·列表·数组"]
L4 --> L5["第5课<br/>流程控制·函数"]
L5 --> L6["第6课<br/>数据管理基础"]
style L1 fill:#1a3a5c,color:#fff
style L2 fill:#2e5984,color:#fff
style L3 fill:#375623,color:#fff
style L4 fill:#7a4419,color:#fff
style L5 fill:#4a2f6b,color:#fff
style L6 fill:#c9a44c,color:#1a3a5cflowchart LR
L1["第1课<br/>环境搭建·基础运算"] --> L2["第2课<br/>数据类型·核心对象"]
L2 --> L3["第3课<br/>Markdown·Quarto"]
L3 --> L4["第4课<br/>矩阵·列表·数组"]
L4 --> L5["第5课<br/>流程控制·函数"]
L5 --> L6["第6课<br/>数据管理基础"]
style L1 fill:#1a3a5c,color:#fff
style L2 fill:#2e5984,color:#fff
style L3 fill:#375623,color:#fff
style L4 fill:#7a4419,color:#fff
style L5 fill:#4a2f6b,color:#fff
style L6 fill:#c9a44c,color:#1a3a5c
提示
六次课合起来,就是独立完成"数据准备"之前所需要的全部R语言基本功。
对照一下,今天这五件事你都做到了吗?
order()对多个相关联的数据一起排序rbind()/cbind()合并数据,理解cbind()对行顺序一致性的要求merge()按共同字段合并两个数据框tapply()进行分组统计read.csv()/write.csv()完成基础的数据读写请花1分钟,在纸条或在线问卷上简要回答:
下周开始项目二"数据准备",将系统学习dplyr、tidyr等专业工具包,把今天用base R"手动挡"做的排序、合并、分组,升级成更简洁高效的"自动挡"写法;同时系统学习CSV、Excel等多种格式的数据导入导出
项目二:数据准备
提示
课前准备:回顾一下这六课学过的向量、数据框、因子操作,项目二会大量用到这些基础。
第6讲:数据管理基础——排序、合并、分组统计与简单数据读写
"In God we trust; all others must bring data." — W. Edwards Deming,质量管理与统计学家
朱 奇 | 锦城大学 · 财会学院
数据挖掘与R语言 | 第6讲:数据管理基础