统计软件 R 语言学习笔记 (3) R 语言初步:基本运算、常见操作和控制流
R 语言初步 (2) 基本运算、常见操作和控制流
本章介绍了 R 语言中常见的运算和操作(例如索引),以及针对不同数据类型的不同操作函数(例如 apply 函数)。同时介绍了 R 语言控制流(if-else 条件执行、for while repeat 循环结构)的实现。
代码和笔记存储在 GitHub 库 【持续更新中,建议 star!】
1 基本运算和操作
1.1 向量的下标运算
1 | age <- c(1, 2, 3, 4, 5, 6, 7, 8, 9) |
a[i]表示取第i个元素a[c(1, 2, 3)]表示取第1 , 2, 3个元素a[-1]表示输出a删去第1个元素的结果a[-c(1, 2, 3)]表示输出a删去第1, 2, 3个元素的结果- 特别地,索引支持逻辑运算
1 | > weight <- c(1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9) |
可以配合逻辑运算符
1 | > age <- c(1, 2, NA, 4) |
is.na()检查每个元素是否为空,返回一个向量!表示非运算;&表示与运算
1.2 矩阵的下标运算
1 | > x <- matrix(1:9, 3, 3, byrow = TRUE) |
1 | > x[8] |
1.3 数据框:列向量的访问
1.3.1 使用 $ 访问列
使用 $ 访问数据库中的列
1 | # %% 数据框 |
1 | > df$age |
1.3.2 使用 attach 和 detach 函数
也可以使用 attach(df) 进入数据框,然后就可以直接使用列名调用数据,使用 detach(df) 退出数据框
1 | > attach(df) |
attach和detach也使用与 list 类型
1.4 列表的索引
1 | > x <- list(member = 3, name=c("Tom", "Jerry", "John")) |
- 使用
$索引
1 | > x$member |
- 可以使用
attach和detach
1 | > attach(x) |
- 取一次
[]得到的还是列表,需要取[[]]得到向量
1 | > x[1] |
2 常用操作符和函数
2.1 数值型向量
2.1.1 逐元素计算
| 算术运算符 | 描述 |
|---|---|
+ |
加 |
- |
减 |
* |
乘 |
/ |
除 |
^ 或 ** |
幂次 |
x %% y |
取余数,等价于 x mod y |
x %/% y |
除法求商,例如 9 %/% 4 = 2 |
- 比较符号返回逻辑运算结果
- 其他运算采用逐元素计算的方式
1 | > x <- 1:4 |
特别地,R 语言的向量运算中存在循环法则
当向量长度不同时,会循环复制短的向量,直到长度相等后再运算:
1 | > 1:2 + 1:4 |
例如:(1, 2) + (1, 2, 3, 4) 等价于 (1, 2, 1, 2) + (1, 2, 3, 4)
例如:(1, 2, 3) + (1, 2, 3, 4, 5) 等价于 (1, 2, 3, 1, 2) + (1, 2, 3, 4, 5)
2.1.2 一些常见的函数
例如:sin, cos, tan, asin, acos, atan, atan2, 10g, 10g10, exp
1 | > x <- c(1, 2, 3, 4) |
2.2 数值型矩阵
2.2.1 常见操作
t(x):转置diag(X):对角阵%*%:矩阵乘法solve(a, b):求解a %*% X = b的解Xsolve(a):矩阵的逆rowSums(x):行方向加和colSums(x):列方向加和rowMeans(x):行平均colMeans(x):列平均dist(x):计算矩阵x行间的距离
简单的
+, -, *, /仅仅是逐元素计算
1 | > x <- matrix(1:4, 2, 2) |
1 | > rowSums(x) |
2.2.2 apply 函数
格式
1 | apply(x, margin, fun) |
1 | > z <- matrix(1:4, 2, 2) |
2.3 逻辑型向量
any()函数 :只要有一个逻辑值为TRUE,返回TRUEall()函数 :所有逻辑值均为TRUE时,返回TRUEwhich()函数 : 返回TRUE的位置
1 | > x <- c(TRUE, FALSE, TRUE, FALSE) |
2.4 字符型向量

2.4.1 paste 函数
paste()函数可以将多个字符串连接成一个字符串
paste(str1, str2, ..., sep = " ") 默认以空格隔开,此时合并的是各个元素 str
1 | > paste("hello", "the", "world", "!") # 默认 sep 空格隔开 |
paste(vector1, vector2, ..., sep = " ", collapse = NULL) 连接向量时,默认空格分割各个元素,但默认 collapse 为空,即不连接最后的字符型向量。
1 | > paste(1:3, rep("th", 3), sep = "") # collapse = NULL 返回字符类型向量 |
sep 代表每个元素内的连接方式,collapse 代表每个元素间是否连接和连接方式。
第一个等价于
paste(1:3, "th", sep = ""):只要有一个向量就会返回字符类型向量
2.4.2 strsplit 函数
strsplit 函数用来分割字符串
格式
1 | strsplit(x, split = "") |
1 | > x <- "hello the world" |
1 | > y <- strsplit(x, split = " ") |
返回的是列表,先取
[[1]]把向量取出,然后[1]取出向量的第一个元素。
2.4.3 substr 函数
substr 函数提取子字符串
格式
1 | substr(x, from, stop) |
1 | > x <- "1234" |
也可对向量进行操作:
1 | > x <- c("123", "456", "789") |
3 控制流
3.1 if-else 条件执行
在R语言中,if-else 语句用于根据条件执行不同的代码块。它是一种控制流语句,允许程序根据条件的真假选择执行不同的操作。
格式
1 | if (condition) { |
例如:
1 | > x <- 3 |
- 同样也具有
if-else if -else语句结构
1 | if (condition1) { |
3.2 ifelse 函数
ifelse() 对向量中的每个元素进行条件判断并返回结果,得到一个向量。
格式
1 | ifelse(condition, statement1, statement2) |
例如:
1 | > score <- c(40, 50, 60, 70, 80, 90) |
3.3 for 循环
for 循环 :重复地执行一个语句,直到某个变量 var 的值不再包含在序列 seq 中为止。
格式
1 | for (var in seq) statement |
例如:
1 | for (i in 1:10) { |
3.4 while 循环
while 循环 :重复地执行一个语句,直到条件不为真为止。
格式
1 | while (condition) { |
例如:
1 | i <- 0 |
3.5 repeat 循环
repeat 循环是一种无限循环结构,它会重复执行代码块,直到显式地使用 break 语句退出循环。
格式
1 | repeat { |
例如:
1 | x <- 1 |
在R语言中,循环的效率可能较低。尤其是在处理大规模数据时。为了提高代码效率,R提供了许多内建函数和
apply族函数,它们通常是基于C语言实现的,执行速度更快。R 语言提高效率的方法大多来自向量计算,使用循环会破坏这种高效的计算方式。



