R 基础运算(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据分析与统计领域,R 语言凭借其强大的运算能力和丰富的生态库,成为开发者和研究人员的首选工具之一。无论是处理简单的数学表达式,还是操作复杂的矩阵和数据框,掌握 R 基础运算 是高效使用 R 语言的核心能力。本文将通过循序渐进的讲解,结合具体案例与代码示例,帮助编程初学者和中级开发者快速上手 R 语言的基础运算操作。
算术运算符与基本表达式
核心运算符与优先级
R 语言的算术运算符与数学中的符号基本一致,支持加减乘除、指数、取模等操作。理解运算符的优先级是避免错误的关键:
result <- 2 + 3 * 4 / (6 - 2)^2
print(result) # 输出:2 + (3*4)/(4^2) = 2 + 12/16 = 2.75
- 优先级顺序:
^
(指数) >*
,/
,%
(取模) >+
,-
- 括号的作用:通过
()
可以明确运算顺序,例如(2 + 3) * 4
的结果为20
,而非2 + 12 = 14
。
向量化运算:R 的核心优势
与 Python 或 C++ 不同,R 的向量化运算特性允许对整个向量或数组直接进行操作,无需显式循环。例如:
vector_a <- c(1, 2, 3)
vector_b <- c(4, 5, 6)
result <- vector_a + vector_b
print(result) # 输出:5 7 9
result_scaled <- vector_a * 2
print(result_scaled) # 输出:2 4 6
比喻:向量化运算如同“传送带”——将输入数据逐个“传送”到运算器中,自动完成批量处理,效率远高于逐个元素的循环操作。
逻辑运算与条件判断
比较运算符与逻辑值
R 支持 ==
(等于)、!=
(不等于)、<
, >
, <=
, >=
等比较运算符,结果返回 TRUE
或 FALSE
。例如:
print(3 > 2) # 输出:TRUE
print("apple" == "Apple") # 输出:FALSE(区分大小写)
逻辑运算符与条件组合
通过 &
(与)、|
(或)、!
(非)可以组合多个条件:
x <- 5
y <- 10
print((x < 10) & (y > 5)) # 输出:TRUE
print(!(x == y)) # 输出:TRUE
注意:在向量化的逻辑运算中,&
和 |
会逐元素比较,而 &&
和 ||
仅比较第一个元素,适用于单值条件判断。
实际案例:数据筛选
在数据框中筛选符合条件的行:
data <- data.frame(
Name = c("Alice", "Bob", "Charlie"),
Age = c(25, 30, 22),
Score = c(85, 90, 78)
)
filtered_data <- data[(data$Age > 25) & (data$Score > 85), ]
print(filtered_data)
输出结果:
Name Age Score
2 Bob 30 90
向量的创建与高级运算
向量的多样化创建方法
除了 c()
函数,R 还提供了 seq()
, rep()
, sample()
等工具:
numbers <- seq(from = 1, to = 10, by = 2) # 输出:1 3 5 7 9
repeated <- rep(c("A", "B"), times = 3) # 输出:"A" "B" "A" "B" "A" "B"
random_sample <- sample(1:10, size = 5) # 输出随机 5 个不重复的数字
向量的数学变换与统计
向量支持丰富的数学函数与统计运算:
vec <- c(10, 20, 30, NA, 50) # 包含缺失值(NA)
print(mean(vec, na.rm = TRUE)) # 忽略 NA,计算均值:30
print(sum(vec, na.rm = TRUE)) # 总和:110
log_values <- log(vec, base = 10) # 对数转换
sqrt_values <- sqrt(vec) # 平方根
注意:缺失值(NA
)在运算中会传播,需用 na.rm = TRUE
参数处理。
矩阵与数组运算
矩阵的创建与基本操作
使用 matrix()
函数创建矩阵,指定行数(nrow
)或列数(ncol
):
mat <- matrix(1:6, nrow = 2, byrow = TRUE)
print(mat)
输出:
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
矩阵运算与线性代数
R 支持矩阵的加减、乘法、转置等操作:
mat1 <- matrix(1:4, nrow = 2)
mat2 <- matrix(c(1, 0, 0, 1), nrow = 2)
result <- mat1 %*% mat2
print(result)
transposed <- t(mat1)
print(transposed)
比喻:矩阵的转置如同“镜像翻转”,将行变为列,列变为行,常用于数据格式的调整。
数据框的运算与子集选择
数据框的结构与操作
数据框(data.frame
)是 R 中最常用的结构,支持混合数据类型(数值、字符、逻辑等)。通过下标 [row, column]
进行子集选择:
df <- data.frame(
ID = 1:3,
Category = c("A", "B", "C"),
Value = c(100, 200, 300)
)
category_col <- df[, 2]
filtered_df <- df[df$ID > 1, ]
按条件筛选与列运算
结合逻辑运算符,可实现复杂的筛选与列级计算:
condition <- (df$Value > 150) & (df$Category %in% c("B", "C"))
result_df <- df[condition, ]
df$Mean_Value <- mean(df$Value, na.rm = TRUE)
函数应用与向量化操作的进阶技巧
apply 家族函数
apply()
、lapply()
、sapply()
等函数可高效处理数据结构:
mat <- matrix(1:6, nrow = 2)
column_sums <- apply(mat, MARGIN = 2, FUN = sum) # MARGIN=2 表示按列
list_data <- list(a = 1:3, b = 4:6)
squared_list <- lapply(list_data, function(x) x^2)
匿名函数与自定义运算
通过 function()
可快速定义匿名函数:
std_dev <- function(x) sqrt(mean((x - mean(x))^2))
result <- std_dev(c(1, 2, 3, 4, 5))
常见陷阱与调试技巧
类型转换与缺失值处理
- 类型不匹配:尝试将字符与数值相加会引发错误,需用
as.numeric()
转换。# 错误示例 "10" + 5 # 报错,需改为 as.numeric("10") + 5
- 缺失值的传播:使用
na.omit()
或complete.cases()
剔除含NA
的行。
维度与长度不匹配
在向量运算中,若两个向量长度不同且无法广播(如 c(1,2) + c(3,4,5)
),R 会发出警告并循环较短的向量,可能导致意外结果。
结论
掌握 R 基础运算 是解锁 R 语言潜力的第一步。从简单的算术表达式到复杂的矩阵运算,再到数据框的高效处理,本文通过案例与代码示例,系统梳理了核心知识点。建议读者通过实践加深理解,例如尝试以下练习:
- 使用向量化运算实现两个向量的点积;
- 对数据框按多条件分组计算均值;
- 编写函数计算任意数据的中位数绝对偏差(MAD)。
R 语言的运算能力远不止于此,但扎实的基础运算功底将为后续学习高级统计分析、可视化或机器学习算法奠定坚实基础。现在,拿起键盘,让代码与数据开始对话吧!