Skip to content

R - 运算符

运算符是告诉 R 解释器执行特定数学、关系或逻辑运算的符号。R 拥有一套丰富的内置运算符,对于任何分析都至关重要。

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 赋值运算符
  • 其他运算符(包括管道运算符)

这些运算符执行标准数学计算。当应用于向量时,运算是按元素级别执行的。

运算符描述示例
+加法v <- c(2, 5.5, 6)
t <- c(8, 3, 4)
print(v + t)
# [1] 10.0 8.5 10.0
−减法v <- c(2, 5.5, 6)
t <- c(8, 3, 4)
print(v - t)
# [1] -6.0 2.5 2.0
*乘法v <- c(2, 5.5, 6)
t <- c(8, 3, 4)
print(v * t)
# [1] 16.0 16.5 24.0
/除法v <- c(2, 5.5, 6)
t <- c(8, 3, 4)
print(v / t)
# [1] 0.250000 1.833333 1.500000
%%求模(除法余数)v <- c(2, 5.5, 6)
t <- c(8, 3, 4)
print(v %% t)
# [1] 2.0 2.5 2.0
%/%整除v <- c(2, 5.5, 6)
t <- c(8, 3, 4)
print(v %/% t)
# [1] 0 1 1
^幂运算v <- c(2, 5.5, 6)
t <- c(8, 3, 4)
print(v^t)
# [1] 256.000 166.375 1296.000

这些运算符按元素级别比较两个向量,并返回一个逻辑向量(TRUE 或 FALSE)。

运算符描述示例
>大于v <- c(2, 5.5, 6, 9)
t <- c(8, 2.5, 14, 9)
print(v > t)
# [1] FALSE TRUE FALSE FALSE
<小于v <- c(2, 5.5, 6, 9)
t <- c(8, 2.5, 14, 9)
print(v < t)
# [1] TRUE FALSE TRUE FALSE
==等于v <- c(2, 5.5, 6, 9)
t <- c(8, 2.5, 14, 9)
print(v == t)
# [1] FALSE FALSE FALSE TRUE
<=小于或等于v <- c(2, 5.5, 6, 9)
t <- c(8, 2.5, 14, 9)
print(v <= t)
# [1] TRUE FALSE TRUE TRUE
>=大于或等于v <- c(2, 5.5, 6, 9)
t <- c(8, 2.5, 14, 9)
print(v >= t)
# [1] FALSE TRUE FALSE TRUE
!=不等于v <- c(2, 5.5, 6, 9)
t <- c(8, 2.5, 14, 9)
print(v != t)
# [1] TRUE TRUE TRUE FALSE

逻辑运算符作用于逻辑向量。非零数字被视为 TRUE,零被视为 FALSE。元素级别运算(&、|)与短路运算(&&、||)之间存在关键区别。

运算符描述示例
&按元素与运算。比较两个向量的每个元素。v1 <- c(TRUE, TRUE, FALSE, FALSE)
v2 <- c(TRUE, FALSE, TRUE, FALSE)
print(v1 & v2)
# [1] TRUE FALSE FALSE FALSE
|按元素或运算。比较两个向量的每个元素。v1 <- c(TRUE, TRUE, FALSE, FALSE)
v2 <- c(TRUE, FALSE, TRUE, FALSE)
print(v1 | v2)
# [1] TRUE TRUE TRUE FALSE
!逻辑非运算。反转向量的每个元素。v1 <- c(TRUE, FALSE, 0, 6)
print(!v1)
# [1] FALSE TRUE TRUE FALSE
&&短路与运算。仅评估每个向量的第一个元素,如果第一个元素是 FALSE 则停止。v <- c(TRUE, FALSE)
t <- c(TRUE, TRUE)
print(v && t) # 仅比较 v[1] 和 t[1]
# [1] TRUE
||短路或运算。仅评估每个向量的第一个元素,如果第一个元素是 TRUE 则停止。v <- c(FALSE, TRUE)
t <- c(FALSE, FALSE)
print(v || t) # 仅比较 v[1] 和 t[1]
# [1] FALSE

这些运算符用于为变量赋值。R 社区对于使用哪个运算符有很强的惯例。

运算符描述最佳实践
<-左赋值这是 R 中首选的、地道的赋值运算符。 始终用它来为对象赋值。my_variable <- 10
=左赋值可用于赋值,但从风格上讲,在函数调用中设置参数时更倾向于使用它,以避免歧义。mean(x = my_data, na.rm = TRUE)
->右赋值将左侧的值赋给右侧的对象。它很少使用,因为它会降低可读性。10 -> my_variable(避免使用)
<<-全局赋值将值赋给父环境中的对象。这会使代码非常难以调试,初学者应避免使用。它在函数内部有特定用途,但这些是高级主题。

这些运算符执行专门的任务,从创建序列到转换数据管道。

运算符描述示例
:冒号运算符。创建数字序列。v <- 2:8
print(v)
# [1] 2 3 4 5 6 7 8
%in%值匹配。检查左向量的元素是否存在于右向量中。v1 <- c(5, 10, 15)
t <- 1:10
print(v1 %in% t)
# [1] TRUE TRUE FALSE
%*%矩阵乘法。执行点积矩阵乘法。A <- matrix(1:4, nrow = 2)
B <- matrix(c(1, 0, 0, 1), nrow = 2)
print(A %*% B)
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
|>原生管道运算符。将左侧对象作为右侧函数的第一个参数传递。需要 R 版本 >= 4.1.0。# 计算正数的均值
my_data <- c(-1, 0, 5, 10, -5)
my_data |> subset(x = _, subset = _ > 0) |> mean()
# [1] 7.5
%>%Magrittr 管道运算符。最初的 Tidyverse 管道。比 |> 更强大(例如,带有 . 占位符)。library(magrittr)
# 获取 iris 数据集中两列的相关性
iris %>% subset(Sepal.Length > 5) %>% cor(.$Sepal.Length, .$Petal.Length)
# [1] 0.819382