第三章:R语言基础语法与数据结构归纳总结
学R语言,说白了就是跟数据和函数打交道。我个人习惯先把基础语法和数据结构理清楚,后面做特征统计才不会手忙脚乱。这一章我把最常用的东西串起来,你看完可以直接上手写代码。
3.1 基础语法:那些你每天都用的东西
R的语法其实挺简洁,但也有它自己的脾气。我先说说赋值,这事我刚开始就踩过坑。
赋值操作符:R里<-是标准赋值,=也能用,但作用域有细微差别。我建议统一用<-,因为很多R包源码都这么写,看着更地道。
x <- 42 # 标准赋值
mean_value <- mean(c(1,2,3))
y = 5 # 也可以,但在函数内部会有歧义
注释:用井号 # 开头。别偷懒,我项目里见过一段没注释的代码,三天后自己都看不懂写了啥。
控制流:if、else、for、while 跟C语言很像,但R里括号可以省略(虽然我不建议这么做)。
if (x > 0) {
print("正数")
} else {
print("非正数")
}
for (i in 1:5) {
print(i ^ 2)
}
避坑:R的索引从1开始,不是0!我曾经写循环时用了for (i in 0:5),结果第一轮就访问了越界元素,debug了半天。切记啊。
3.2 数据结构:R的六种基本类型
R的数据结构大概分六种,但日常搞特征工程,你八成时间都在跟向量、数据框和列表打交道。我整理了一个对比表格,看一眼就清楚。
| 数据结构 | 维度 | 元素类型 | 典型用法 |
|---|---|---|---|
| 向量 (vector) | 1维 | 同类型(数字/字符/逻辑) | 存储单列特征 |
| 矩阵 (matrix) | 2维 | 同类型 | 数值矩阵运算 |
| 数组 (array) | 多维 | 同类型 | 张量数据(少用) |
| 列表 (list) | 1维 | 可混合不同类型 | 存储异构特征 |
| 数据框 (data.frame) | 2维 | 每列可不同类型 | 结构化数据集(主力) |
| 因子 (factor) | 1维 | 分类水平 | 管理类别特征 |
我个人最常用的就是向量和数据框。向量是R里最基础的原子单位,数据框则对应我们常说的表格数据。
3.3 向量:最核心的一维容器
创建向量的方式很多,c() 是最直接的。我就用这个。
num_vec <- c(1, 3, 5, 7)
char_vec <- c("a", "b", "c")
logi_vec <- c(TRUE, FALSE, TRUE)
# 注意:类型自动统一!
mixed <- c(1, "two") # 结果全部变成字符型:"1", "two"
我曾经犯过的一个错误:把数字和字符混在一个向量里,以为R会保留数字类型。结果它自动转换成字符,后续做统计时全部报错。所以一定要提前检查向量类型,用 class() 或 str()。
向量化操作:这是R的杀手锏。写一个 + 就能对整个向量做运算,不用写循环。
a <- 1:5
b <- 6:10
a + b # 7 9 11 13 15
a * 2 # 2 4 6 8 10
sqrt(a) # 1 1.414 1.732 2 2.236
为什么快?因为底层用C语言并行算。我项目里处理百万级数据时,向量化能比for循环快几十倍。
3.4 数据框:你的数据分析主战场
几乎所有的特征工程都在数据框上操作。创建数据框用 data.frame(),列名就是变量名。
df <- data.frame(
id = 1:4,
score = c(85, 92, 78, 95),
grade = c("B", "A", "C", "A")
)
# 查看结构
str(df)
# 'data.frame': 4 obs. of 3 variables:
# $ id : int 1 2 3 4
# $ score: num 85 92 78 95
# $ grade: chr "B" "A" "C" "A"
常用操作:我列几个你马上会用到的。
head(df)看前几行dim(df)看行列数names(df)看列名df$score提取一列(返回向量)df[1:3, ]提取前3行
日常实操:我习惯先用 summary(df) 快速扫一眼每个列的基本统计量,立刻就能发现缺失值和异常值。这比盯着原始数据看快得多。
3.5 列表与因子:两个容易被忽略的利器
列表可以装任何东西,包括数据框甚至另一个列表。在做复杂特征组合时特别有用。
my_list <- list(
name = "Alice",
scores = c(90, 85, 92),
info = data.frame(age = 25, city = "NYC")
)
# 用双中括号或$访问
my_list$name
my_list[["scores"]]
因子本质是整数向量+水平标签,专门处理分类变量。我建议所有分类特征都转成因子,绘图或建模时自动按水平排序,不会乱。
gender <- factor(c("M", "F", "M", "F"))
levels(gender) # 默认按字母顺序
# 可以手动指定顺序
gender <- factor(gender, levels = c("F", "M"))
重要概念:R里 NA 表示缺失值,几乎所有函数遇到 NA 都会返回 NA,需要加参数 na.rm = TRUE 才能忽略。我刚开始用 mean(x) 老是返回 NA,后来才养成习惯先处理缺失值。
3.6 知识结构总览
下面这张图把R语言基础语法和数据结构的脉络串起来。你可以把它当个速查路线图。
图上把基础语法、数据结构和特征统计核心串在了一起。你想想看:数据框的每一列其实就是一个向量,向量化运算又依赖基础语法。整个R语言的数据分析都是在这个环上转的。
3.7 避坑与实操建议
最后我塞几句自己摔过的跟头,你记下来能省不少时间。
- 检查类型:用
class()确认对象类型,尤其是从文件读进来的数据,经常是字符型而不是数值型。 - 别信默认:
read.csv()默认把字符列转成因子,我建议加上stringsAsFactors = FALSE。 - 用str():这是我debug时用得最多的函数,比直接打印整个数据框清晰一百倍。
我曾经有一次:用 apply() 对数据框的每一列求均值,结果因为一列是字符类型,整个结果变成字符向量。从那以后我养成了先 sapply(df, class) 再批量处理的习惯。