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 支持 ==(等于)、!=(不等于)、<, >, <=, >= 等比较运算符,结果返回 TRUEFALSE。例如:

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 语言潜力的第一步。从简单的算术表达式到复杂的矩阵运算,再到数据框的高效处理,本文通过案例与代码示例,系统梳理了核心知识点。建议读者通过实践加深理解,例如尝试以下练习:

  1. 使用向量化运算实现两个向量的点积;
  2. 对数据框按多条件分组计算均值;
  3. 编写函数计算任意数据的中位数绝对偏差(MAD)。

R 语言的运算能力远不止于此,但扎实的基础运算功底将为后续学习高级统计分析、可视化或机器学习算法奠定坚实基础。现在,拿起键盘,让代码与数据开始对话吧!

最新发布