R 语言中的向量和矩阵详解
在 R 语言中,向量(Vector) 和 矩阵(Matrix) 是两种最基础且最重要的数据结构,它们是构建更复杂数据结构(如数据框、列表)的基础。
一、向量(Vector)
- 基本概念
向量是 R 中最基本的一维数据结构:
• 存储相同类型的元素(数值、字符、逻辑值等)
• 长度可变
• 索引从 1 开始(不是从 0 开始)
• 支持向量化操作(对整个向量执行操作)
- 创建向量
数值向量
num_vec <- c(1, 2, 3, 4, 5)
字符向量
char_vec <- c(“apple”, “banana”, “orange”)
逻辑向量
log_vec <- c(TRUE, FALSE, TRUE)
使用序列函数
seq_vec <- 1:10 # 1到10的整数序列
rep_vec <- rep(5, 3) # 重复5三次: c(5,5,5)
- 向量操作
访问元素
char_vec[2] # 返回 “banana”
修改元素
num_vec[3] <- 10
向量运算(向量化)
v1 <- c(1,2,3)
v2 <- c(4,5,6)
v1 + v2 # 结果: 5,7,9
常用函数
length(num_vec) # 向量长度
sum(num_vec) # 求和
mean(num_vec) # 平均值
sort(char_vec) # 排序
- 向量类型
• 数值型(numeric):c(1.5, 2.7, 3.0)
• 整型(integer):c(1L, 2L, 3L)
• 字符型(character):c(“a”, “b”, “c”)
• 逻辑型(logical):c(TRUE, FALSE, TRUE)
• 因子(factor):分类变量,如 factor(c(“male”, “female”, “male”))
二、矩阵(Matrix)
- 基本概念
矩阵是二维数据结构:
• 所有元素必须是相同类型
• 有固定的行数和列数
• 通过行和列索引访问元素
• 常用于数值计算和线性代数
- 创建矩阵
从向量创建
mat <- matrix(1:12, nrow = 3, ncol = 4)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
按行填充
mat_row <- matrix(1:12, nrow = 3, byrow = TRUE)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
合并向量
cbind(c(1,2,3), c(4,5,6)) # 按列合并
rbind(c(1,2,3), c(4,5,6)) # 按行合并
- 矩阵操作
访问元素
mat[2, 3] # 第2行第3列的元素
mat[1, ] # 第1行所有元素
mat[, 2] # 第2列所有元素
维度信息
dim(mat) # 返回 c(行数, 列数)
nrow(mat) # 行数
ncol(mat) # 列数
矩阵运算
mat * 2 # 每个元素乘以2
mat + mat # 矩阵加法
t(mat) # 转置矩阵
mat %*% t(mat) # 矩阵乘法
行列命名
rownames(mat) <- c(“Row1”, “Row2”, “Row3”)
colnames(mat) <- c(“Col1”, “Col2”, “Col3”, “Col4”)
三、向量与矩阵的关系
-
矩阵是特殊的向量:
• 矩阵实际上是带有维度属性(dim)的向量
vec <- 1:12
dim(vec) <- c(3, 4) # 将向量转换为3×4矩阵 -
存储方式:
• 矩阵元素按列存储(除非指定byrow=TRUE)
matrix(1:4, nrow=2)[,1] [,2]
[1,] 1 3
[2,] 2 4
-
类型要求:
• 向量和矩阵都要求所有元素是相同类型• 如果混合类型,R会自动转换(类型优先级:字符 > 数值 > 逻辑)
四、实际应用场景
向量应用:
• 存储单变量数据(如患者年龄)
• 函数参数传递
• 循环和条件判断
矩阵应用:
• 存储基因表达数据(行=基因,列=样本)
• 图像处理(像素矩阵)
• 线性代数运算
• 统计模型输入
五、重要注意事项
-
索引从1开始:R的索引从1开始,不是0
-
类型强制转换:混合类型时自动转换
-
向量回收:操作不同长度向量时,短向量会循环使用
c(1,2,3) + c(1,2) # 结果: 2,4,4 (回收规则) -
维度属性:矩阵的维度可通过dim()函数修改
理解向量和矩阵是掌握R语言的基础,它们是构建数据框(data.frame)、数组(array)等更复杂数据结构的基础,也是高效数据处理的关键。
R语言向量和矩阵 vs Python数据结构对比
您理解得非常准确!R语言的向量和矩阵与Python中的数据结构有明确的对应关系,但也有一些重要区别。让我详细解释一下:
R向量 vs Python数据结构
特性 R向量 (Vector) Python一维数组 Python列表 (List)
维度 一维 一维 一维
元素类型 必须相同(同质) 必须相同(同质) 可以不同(异质)
创建方式 c(1,2,3) np.array([1,2,3]) [1,2,3]
索引 从1开始 从0开始 从0开始
类型转换 自动强制转换 严格类型要求 允许混合类型
向量化操作 原生支持 需要NumPy支持 不支持
内存效率 高 高 较低
典型用途 数据存储、计算 数值计算 通用容器
关键区别:
- 索引起点:R从1开始,Python从0开始
- 类型要求:R向量和NumPy数组要求同质元素,Python列表允许异质
- 向量化:R原生支持向量运算,Python需要NumPy库
R矩阵 vs Python数据结构
特性 R矩阵 (Matrix) Python二维数组 Python二维列表
维度 二维 二维 二维
元素类型 必须相同(同质) 必须相同(同质) 可以不同(异质)
创建方式 matrix(1:4, nrow=2) np.array([[1,2],[3,4]]) [[1,2],[3,4]]
内存布局 列优先 行优先(默认) 嵌套列表
数学运算 原生支持 需要NumPy 不支持
性能 高效 高效(C底层) 较低
维度属性 固定维度 固定维度 不规则维度
典型用途 数值计算、线性代数 数值计算、机器学习 通用数据结构
关键区别:
- 内存顺序:R矩阵默认列优先存储,NumPy数组默认行优先
- 数学支持:R矩阵原生支持线性代数运算,Python需要NumPy
- 维度规则:R矩阵要求矩形结构,Python二维列表可以是锯齿状
实际代码对比
创建一维结构
R 向量
r_vector <- c(1, 2, 3, 4, 5)
Python 一维数组 (NumPy)
import numpy as np
py_array = np.array([1, 2, 3, 4, 5])
Python 列表
py_list = [1, 2, 3, 4, 5]
创建二维结构
R 矩阵
r_matrix <- matrix(1:9, nrow=3, byrow=TRUE)
Python 二维数组 (NumPy)
py_2d_array = np.array([[1,2,3], [4,5,6], [7,8,9]])
Python 二维列表
py_2d_list = [[1,2,3], [4,5,6], [7,8,9]]
运算对比
R 向量运算(原生支持)
r_vector * 2 # 每个元素乘以2
Python 列表不支持向量运算
py_list * 2 会重复列表两次,而不是元素乘以2
NumPy 数组支持向量运算
py_array * 2 # 每个元素乘以2
重要注意事项
-
类型转换:
• R:c(1, “a”) → 自动转换为字符向量 c(“1”, “a”)• Python NumPy:np.array([1, “a”]) → 转换为字符串数组
• Python列表:[1, “a”] → 保留原始类型
-
性能考虑:
• R矩阵和Python NumPy数组都基于C实现,性能高• Python二维列表是嵌套结构,性能较低
-
功能扩展:
• R:矩阵是基础类型,线性代数函数内置• Python:需要NumPy库进行高效矩阵运算
-
不规则结构:
• R矩阵必须是矩形(每行相同列数)• Python二维列表可以是锯齿状(各行不同列数)
总结
• R向量 ≈ Python NumPy一维数组:同质、高效、支持向量化运算
• R矩阵 ≈ Python NumPy二维数组:矩形结构、高效数学运算
• Python列表 ≈ R列表(list):异质、灵活但性能较低
在实际数据分析中:
• 使用R向量/矩阵或Python NumPy数组进行数值计算
• 使用R列表或Python列表处理混合类型数据
• 在R中,矩阵是基础数据结构;在Python中,NumPy数组是科学计算的基石
理解这些对应关系有助于在两种语言间转换思维,但也要注意它们在索引、内存布局和默认行为上的差异。

被折叠的 条评论
为什么被折叠?



