本节摘要:正式开卷鸢尾花案。用 data 装载 iris 数据集,用 str、summary、head、tail、dim 完成标准化的首次检视流程,看懂 R 如何"描述"一份数据,并学会查看数据框的行列与取值。
R 自带一批历史案卷供练手,iris 是其中最著名的一份:150 行,每行一朵花,前四列是萼片长宽与花瓣长宽(单位厘米),第五列是物种名。首次勘验要回答三个问题:证据有多少?每列是什么类型?数值大概什么范围?
# 调阅案卷 data(iris) # 问题一:证据有多少——150 行 5 列 dim(iris) # 问题二:每列什么类型 str(iris)
str 的输出值得逐行读一遍:
'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 ... $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 ... $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 ... $ Petal.Width : num 0.2 0.2 0.2 0.1 0.2 ... $ Species : Factor w/ 3 levels "setosa","versicolor","virginica": 1 1 ...
四列 num(数值),一列 Factor 且只有 3 个水平——这一行信息量极大:物种列不是自由文本,是登记在册的三个类别。
# 数值证据的分布轮廓:最小值、四分位数、中位数、均值 summary(iris$Sepal.Length) # 查看卷宗开头与结尾各 6 行——两头都要看,防止末尾混入脏数据 head(iris) tail(iris) # 物种的证物清点:每种各 50 朵,三方证据均衡 table(iris$Species)
$ 是取列的手势:iris$Sepal.Length 读作"iris 案卷里的 Sepal.Length 这一列"。取出来的是一个向量——下一节专门讲它。
💡 关键直觉:summary 输出里,均值和中位数差距明显,往往提示偏态或离群值;分位数间距比标准差更"抗干扰"。第一次看数据就盯住这两处,很多问题在勘验阶段就能暴露。
三件套之外,真正开始"翻卷宗"还要会三件事:切出一部分行、按条件筛、数清每个取值出现几次。继续在 iris 上演练:
# 切出前 10 朵 setosa 的测量记录:先筛物种,再看花瓣两列 setosa10 <- iris[iris$Species == "setosa", ] setosa10[1:10, c("Petal.Length", "Petal.Width")] # 按条件数证据:花瓣宽度小于 0.5 厘米的有多少朵?都是谁? table(iris$Species[iris$Petal.Width < 0.5]) # 输出: # setosa versicolor virginica # 46 0 0 # 唯一取值与重复检查:测量值有没有登记重样? length(unique(iris$Sepal.Length)) # 35 个不同取值 sum(duplicated(iris)) # 0,整行重复没有
第三段输出给了一个早期案情判断:花瓣宽度小于 0.5 的花全部是 setosa,一个例外都没有——这已经是一条可用的分类线索,第 6 章建模时会正式兑现它。
iris 是教科书级的干净数据,真实案卷几乎从不是。下面手工造一份带问题的卷宗,演练"勘验时发现脏证据"的标准动作:
# 造一份带问题的卷宗:塞入缺失值和一个离群值 df <- data.frame( height = c(170, 165, NA, 180, 175, 999), gender = c("F", "F", "M", "F", "男", "F") ) # 缺失清点:哪列有多少 NA colSums(is.na(df)) # 输出:height 1 处,gender 0 处 # 数值合理性检查:999 显然不是人类身高 summary(df$height) # Min 165 / Median 172.5 / Max 999 —— 最大值直接暴露问题 # 类别取值检查:性别里混进了中文登记 table(df$gender) # 输出里同时出现 "F" "M" "男",口径不统一
这一段先"制造现场"再勘验,是为了演示思路:summary 看极值、table 看取值集合,两招就能抓住大多数低级登记错误。修复动作(缺失插补、口径统一)是第 2 章的正题,这里只需会"发现问题并记录在案"。
| 工具 | 回答的问题 | 适用列类型 | 输出颗粒度 |
|---|---|---|---|
| str | 有几列、各是什么类型 | 全部 | 结构级:类型 + 前几个取值 |
| summary | 数值分布、因子计数 | num、Factor | 分布级:极值、四分位、均值、频数 |
| head/tail | 具体长什么样 | 全部 | 记录级:原始行 |
| table | 每个取值出现几次 | 因子、字符 | 计数级:频数表 |
| colSums(is.na(.)) | 哪里缺证据 | 逻辑矩阵 | 位置级:逐列缺失计数 |
勘验时按 结构 → 分布 → 记录 → 计数 → 缺失 的顺序走一遍,五步下来对任何新数据集都能形成基本判断。
str(as_tibble(iris)) 体验一下即可;两者可用 as.data.frame() 互相转换,本册前四章统一用基础数据框,降低概念负担。