在R语言中,向量(Vector)是最基础、最核心的数据结构。R语言中的几乎所有标量(单个数字或字符)在底层都是作为长度为1的向量存在的。理解向量的运作机制,是精通R语言的关键。
以下是R语言向量语法的详细教程大全。
一、 向量的创建 (Creating Vectors)
在R中,向量是一维的,并且只能包含同一种基本数据类型。
1. 使用 c() 函数拼接
c() 是 concatenate(连接)的缩写,是最常用的创建向量的方法。
r
# 创建数值型向量
v_num <- c(1, 2.5, 4.8, 10)
# 创建字符型向量
v_chr <- c("Apple", "Banana", "Cherry")
# 创建逻辑型向量
v_logi <- c(TRUE, FALSE, TRUE, TRUE)
2. 使用 : 生成连续整数序列
r
v_seq1 <- 1:10 # 包含 1 到 10 的整数
v_seq2 <- 10:1 # 递减序列:10, 9, 8... 1
v_seq3 <- 2.5:8.5 # 生成 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5
3. 使用 seq() 函数生成等差数列
seq() 提供了比 : 更高的自由度。
r
# seq(from, to, by) - by表示步长
seq(1, 10, by = 2) # 返回: 1 3 5 7 9
# seq(from, to, length.out) - 指定生成的元素总个数
seq(0, 1, length.out = 5) # 返回: 0.00 0.25 0.50 0.75 1.00
4. 使用 rep() 函数生成重复序列
r
# rep(x, times) - 整体重复
rep(c(1, 2), times = 3) # 返回: 1 2 1 2 1 2
# rep(x, each) - 逐个元素重复
rep(c(1, 2), each = 3) # 返回: 1 1 1 2 2 2
# 结合使用
rep(c("A", "B"), each = 2, times = 2) # 返回: "A" "A" "B" "B" "A" "A" "B" "B"
二、 向量的数据类型与强制转换
向量要求所有元素类型一致。如果用 c() 拼接不同类型的元素,R会自动进行隐式强制类型转换(Coercion)。
1. 隐式转换规则
转换优先级(从低到高,低优先级会被转换为高优先级):
逻辑型 (Logical) -> 整型 (Integer) -> 数值型 (Numeric) -> 字符型 (Character)
r
c(TRUE, 10) # TRUE 被转为 1,结果为数值型向量: 1 10
c(3.14, "R") # 3.14 被转为字符,结果为字符型向量: "3.14" "R"
c(FALSE, 2L, "A") # 全部转为字符型: "FALSE" "2" "A"
2. 显式类型转换
你可以使用 as.*() 族函数强制改变向量的类型。
r
x <- c("12.5", "8", "99")
as.numeric(x) # 转为数值: 12.5 8.0 99.0
y <- c(0, 1, -5)
as.logical(y) # 0转为FALSE,所有非0值转为TRUE: FALSE TRUE TRUE
三、 为向量元素命名
你可以为向量的每一个元素指定一个名称,这在数据提取时非常有用。
r
# 方法1:创建时直接命名
scores <- c(Math = 90, English = 85, History = 88)
# 方法2:使用 names() 函数后期命名
ages <- c(25, 30, 22)
names(ages) <- c("Alice", "Bob", "Charlie")
# 查看向量的名称
names(scores) # 返回: "Math" "English" "History"
# 清除命名
names(ages) <- NULL
四、 向量的索引与提取 (Subsetting)
注意:R语言的索引是从 1 开始的,不是 0。 使用方括号 [] 进行索引提取。
1. 正整数索引(提取)
r
v <- c(10, 20, 30, 40, 50)
v[1] # 提取第1个元素: 10
v[c(1, 3, 5)] # 提取第1, 3, 5个元素: 10 30 50
v[2:4] # 提取第2到第4个元素: 20 30 40
2. 负整数索引(剔除)
r
v[-1] # 提取除了第1个元素之外的所有元素: 20 30 40 50
v[c(-1, -5)] # 剔除第1和第5个元素: 20 30 40
# 注意:不能在同一个中括号里混用正整数和负整数(例如 v[c(1, -2)] 会报错)。
3. 名称索引
如果向量有名称,可以直接按名称提取。
r
scores <- c(Math = 90, English = 85, History = 88)
scores["English"] # 返回 85
scores[c("Math", "History")] # 返回 90 88
4. 逻辑向量索引(极其重要)
根据条件筛选元素是R语言数据清洗的核心技巧。
r
v <- c(15, 8, 22, 5, 30)
# 返回一个逻辑向量: TRUE FALSE TRUE FALSE TRUE
v > 10
# 将逻辑向量放入中括号,R会提取对应位置为 TRUE 的元素
v[v > 10] # 筛选出大于10的元素: 15 22 30
# 复合条件 (与 &,或 |)
v[v > 10 & v < 25] # 筛选出大于10且小于25的元素: 15 22
五、 向量化运算与循环补齐 (Recycling Rule)
R语言针对向量运算进行了深度优化,你不需要写 for 循环就可以对所有元素进行计算。
1. 向量与标量的运算
r
v <- c(1, 2, 3, 4)
v * 10 # 每一个元素都乘以10: 10 20 30 40
v + 5 # 每一个元素都加5: 6 7 8 9
2. 向量与向量的运算(长度相同)
r
v1 <- c(1, 2, 3)
v2 <- c(10, 20, 30)
v1 + v2 # 对应位置元素相加: 11 22 33
3. 循环补齐规则 (Recycling)
当两个不同长度的向量进行运算时,较短的向量会被重复使用(循环),直到与较长的向量长度一致。
r
v_long <- c(1, 2, 3, 4, 5, 6)
v_short <- c(10, 100)
v_long + v_short
# v_short 会被隐式补齐为: c(10, 100, 10, 100, 10, 100)
# 结果为: 11 102 13 104 15 106
注:如果长向量的长度不是短向量长度的整数倍,R会执行运算,但会弹出一个警告信息 (Warning message)。
六、 常用向量操作函数族
1. 基础信息查询
length(v):返回向量的长度(元素个数)。class(v):返回向量的数据类型。typeof(v):返回更底层的类型(如把 numeric 分为 double 和 integer)。
2. 统计与数学计算
sum(v):求和。mean(v):求平均值。max(v),min(v):求最大、最小值。sd(v),var(v):求标准差、方差。summary(v):提供最小值、四分位数、均值、最大值的综合统计摘要。
3. 排序与顺序
sort(v):对向量的值进行排序(默认升序,降序用sort(v, decreasing = TRUE))。order(v):返回向量排序后的索引值(非常常用于数据框按某列排序)。rev(v):将向量元素首尾反转。
4. 元素查找与去重
unique(v):去除重复元素,返回唯一值。table(v):进行频数统计,返回每个不同元素出现的次数。which(v > 10):返回满足条件的元素的索引位置,而不是元素本身。match(v1, v2)或%in%:查找v1中的元素是否在v2中。
r
c("A", "C") %in% c("A", "B", "C", "D") # 返回: TRUE TRUE
七、 向量中的缺失值 (NA) 处理
在实际数据中,经常会遇到缺失值。在R中,缺失值用 NA (Not Available) 表示。
1. 识别缺失值
绝对不能用 v == NA 来判断缺失值 ,因为缺失值和任何值比较的结果依然是缺失值(NA)。必须使用 is.na() 函数。
r
v <- c(1, 2, NA, 4, 5)
is.na(v) # 返回: FALSE FALSE TRUE FALSE FALSE
v[!is.na(v)] # 提取所有非缺失值元素: 1 2 4 5 (这里用到了 ! 逻辑取反)
2. 计算时的 na.rm 参数
大多数统计函数如果遇到向量包含 NA,默认会直接返回 NA。为了跳过缺失值进行计算,需要添加参数 na.rm = TRUE。
r
v <- c(10, 20, NA, 30)
sum(v) # 返回: NA
sum(v, na.rm = TRUE) # 忽略NA,返回: 60