第三章: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语言基础结构总览 基础语法 赋值 <- / = 控制流 if/for 向量化运算 数据结构 向量 vector 数据框 data.frame 列表 list 特征统计核心 summary() str() / class() 缺失值处理 NA 掌握左边结构,才能用右边工具做特征统计与降维

图上把基础语法、数据结构和特征统计核心串在了一起。你想想看:数据框的每一列其实就是一个向量,向量化运算又依赖基础语法。整个R语言的数据分析都是在这个环上转的。

3.7 避坑与实操建议

最后我塞几句自己摔过的跟头,你记下来能省不少时间。

  • 检查类型:用 class() 确认对象类型,尤其是从文件读进来的数据,经常是字符型而不是数值型。
  • 别信默认:read.csv() 默认把字符列转成因子,我建议加上 stringsAsFactors = FALSE。
  • 用str():这是我debug时用得最多的函数,比直接打印整个数据框清晰一百倍。

我曾经有一次:用 apply() 对数据框的每一列求均值,结果因为一列是字符类型,整个结果变成字符向量。从那以后我养成了先 sapply(df, class) 再批量处理的习惯。