1.<,>,<=,>=,==,!=:比较运算符
x = 5 y = 3 print(x < y) # 输出 False,因为 5 不小于 3 print(x > y) # 输出 True,因为 5 大于 3 print(x <= y) # 输出 False,因为 5 不小于或等于 3 print(x >= y) # 输出 True,因为 5 大于或等于 3 print(x == y) # 输出 False,因为 5 不等于 3 print(x != y) # 输出 True,因为 5 不等于 3
2.!,&,&&,|,||,xor():逻辑运算符
x <- TRUE y <- FALSE result_x <- !x result_y <- !y print(result_x) # 输出 FALSE,因为对 TRUE 进行取反得到 FALSE print(result_y) # 输出 TRUE,因为对 FALSE 进行取反得到 TRUE
&&和&
短路行为:&& 是短路逻辑与(short-circuit AND)运算符,而 & 是非短路逻辑与(non-short-circuit AND)运算符。
&& 是短路逻辑与运算符。当第一个条件为 FALSE 时,&& 将立即返回 FALSE 而不会计算第二个条件。
& 是非短路逻辑与运算符。它对两个条件都进行求值,不管第一个条件的结果是什么。
向量操作:&& 在逻辑向量上只取第一个元素进行逻辑判断,而 & 则逐元素进行逻辑与操作。
&& 运算符只考虑逻辑向量的首个元素,如果首个元素为 FALSE,则结果为 FALSE,不会计算后续元素。
& 运算符用于逐元素逻辑与操作,在逻辑向量中的每对对应元素上执行逻辑与操作,并返回一个新的逻辑向量。
# 使用短路逻辑与运算符 && x <- FALSE && TRUE y <- TRUE && FALSE print(x) # 输出 FALSE,因为第一个条件为 FALSE,不再计算后续的条件 print(y) # 输出 FALSE,因为第一个条件为 TRUE,但第二个条件为 FALSE # 使用非短路逻辑与运算符 & v <- c(TRUE, FALSE, TRUE) result <- v & v print(result) # 输出 TRUE FALSE TRUE,对应位置上的逻辑与结果
短路行为:|| 是短路逻辑或(short-circuit OR)运算符,而 | 是非短路逻辑或(non-short-circuit OR)运算符。
|| 是短路逻辑或运算符。当第一个条件为 TRUE 时,|| 将立即返回 TRUE 而不会计算第二个条件。
| 是非短路逻辑或运算符。它对两个条件都进行求值,不管第一个条件的结果是什么。
向量操作:|| 在逻辑向量上只取第一个元素进行逻辑判断,而 | 则逐元素进行逻辑或操作。
|| 运算符只考虑逻辑向量的首个元素,如果首个元素为 TRUE,则结果为 TRUE,不会计算后续元素。
| 运算符用于逐元素逻辑或操作,在逻辑向量的每对对应元素上执行逻辑或操作,并返回一个新的逻辑向量。
# 使用短路逻辑或运算符 || x <- TRUE || FALSE y <- FALSE || TRUE print(x) # 输出 TRUE,因为第一个条件为 TRUE,不再计算后续的条件 print(y) # 输出 TRUE,因为第一个条件为 FALSE,但第二个条件为 TRUE # 使用非短路逻辑或运算符 | v <- c(TRUE, FALSE, TRUE) result <- v | v print(result) # 输出 TRUE TRUE TRUE,对应位置上的逻辑或结果 xor:用于执行逻辑异或(XOR)操作
异或操作符指示只有一个条件为 TRUE 时,结果为 TRUE;如果两个条件都为 TRUE 或都为 FALSE,则结果为 FALSE。
# 使用 xor() 函数进行逻辑异或操作 x <- TRUE y <- FALSE result1 <- xor(x, y) result2 <- xor(TRUE, TRUE) print(result1) # 输出 TRUE,因为 x 和 y 只有一个为 TRUE print(result2) # 输出 FALSE,因为两个条件都为 TRUE v1 <- c(TRUE, FALSE, TRUE) v2 <- c(FALSE, FALSE, TRUE) result3 <- xor(v1, v2) print(result3) # 输出 TRUE FALSE FALSE,对应位置的异或结果
3.all和any
#如果逻辑向量中的所有元素都为 TRUE,则返回 TRUE;否则返回 FALSE。 v <- c(TRUE, TRUE, TRUE) result1 <- all(v) print(result1) # 输出 TRUE,因为所有元素都为 TRUE v2 <- c(TRUE, FALSE, TRUE) result2 <- all(v2) print(result2) # 输出 FALSE,因为有一个元素为 FALSE #如果逻辑向量中存在至少一个为 TRUE 的元素,则返回 TRUE;否则返回 FALSE。 v3 <- c(FALSE, FALSE, TRUE) result3 <- any(v3) print(result3) # 输出 TRUE,因为存在一个元素为 TRUE v4 <- c(FALSE, FALSE, FALSE) result4 <- any(v4) print(result4) # 输出 FALSE,因为所有元素都为 FALSE
4.ifelse和if...else
#当条件为 TRUE 时,返回为 TRUE 时的结果 #当条件为 FALSE 时,返回为 FALSE 时的结果 v <- c(1, 2, 3, 4, 5) result <- ifelse(v > 3, "大于3", "不大于3") print(result) #输出 [1] "不大于3" "不大于3" "不大于3" "大于3" "大于3" x <- 5 if (x > 0) { print("x 是正数") } else { print("x 不是正数") } #输出 [1] "x 是正数"
5. match
#查找某个元素在向量中的位置 v <- c("apple", "banana", "orange", "pear") index <- match("orange", v) print(index) # 输出 3,因为 "orange" 在 v 中的第三个位置 index2 <- match("grape", v) print(index2) # 输出 NA,因为 "grape" 不存在于 v 中
6.%in%
element %in% vector,其中 element 是要检查的元素,vector 是目标向量或列表。 v <- c("apple", "banana", "orange", "pear") result1 <- "orange" %in% v print(result1) # 输出 TRUE,因为 "orange" 存在于 v 中 result2 <- "grape" %in% v print(result2) # 输出 FALSE,因为 "grape" 不存在于 v 中 elements <- c("apple", "kiwi", "mango") result3 <- elements %in% v print(result3) # 输出 TRUE FALSE FALSE,表示每个元素在 v 中的匹配结果
7.unique
#返回向量中的唯一元素,去除重复的值 v <- c(1, 2, 3, 2, 4, 3, 5) unique_v <- unique(v) print(unique_v) # 输出 1 2 3 4 5,只包含了 v 中的唯一值
8.which与seq(along = x)
#which() 函数用于找出满足给定条件的元素在向量中的索引位置 v <- c(2, 4, 6, 8, 10) indices <- which(v > 5) print(indices) # 输出 3 4 5,表示满足条件 v > 5 的元素在 v 中的索引位置 #这里seq(along=x)会生成由x的下标组成的向量 x <- c(3, 4, 3, 5, 7, 5, 9) which(x > 5) ## [1] 5 7 seq(along=x)[x > 5] ## [1] 5 7 #用which.min()、which.max求最小值的下标和最大值的下标, 不唯一时只取第一个 which.min(x) ## [1] 1 which.max(x) ## [1] 7
9.duplicated
#duplicated() 函数用于检测向量或数据框中的重复元素 #并返回一个逻辑向量表示是否为重复元素 v <- c(1, 2, 3, 2, 4, 3, 5) duplicated_v <- duplicated(v) print(duplicated_v) # 输出 FALSE FALSE FALSE TRUE FALSE TRUE FALSE #第四个、第六个和第七个位置的元素是重复的,而其他位置的元素是首次出现的
10.switch
day <- "Wednesday" weekend <- switch(day, "Monday" = FALSE, "Tuesday" = FALSE, "Wednesday" = FALSE, "Thursday" = FALSE, "Friday" = FALSE, "Saturday" = TRUE, "Sunday" = TRUE, "Unknown") print(weekend) # 输出 FALSE,因为 day 的值为 "Wednesday",被匹配到了工作日中
11.for
for (i in 1:5) { square <- i^2 print(square) } #输出 [1] 1 [1] 4 [1] 9 [1] 16 [1] 25
12.while
i <- 1 while (i <= 5) { square <- i^2 print(square) i <- i + 1 } #输出 [1] 1 [1] 4 [1] 9 [1] 16 [1] 25
13.repeat,break
i <- 1 repeat { square <- i^2 print(square) if (square > 100) { break # 当平方值大于 100 时跳出循环 } i <- i + 1 } #输出 [1] 1 [1] 4 [1] 9 [1] 16 [1] 25 [1] 36 [1] 49 [1] 64 [1] 81 [1] 100
14.next
i <- 1 while (i <= 5) { if (i == 3) { i <- i + 1 next # 跳过当前迭代,进入下一次迭代 } if (i == 5) { break # 在满足条件时跳出循环 } print(i) i <- i + 1 } print("循环结束")
15.apply和lapply
apply(X, MARGIN, FUN)
X 是要应用函数的数组;
MARGIN 指定要应用函数的维度,1 表示按行应用,2 表示按列应用;
FUN 是要应用的函数。
matrix <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2) col_sums <- apply(matrix, 2, sum) print(col_sums) # 输出每列的总和
lapply(X, FUN)
X 是要应用函数的列表;
FUN 是要应用的函数。
my_list <- list("apple", "banana", "orange") lengths <- lapply(my_list, length) print(lengths) # 输出每个元素的长度
16.sapply,tapply和sweep
(1)sapply()
sapply(X, FUN)
X 是要应用函数的列表或向量;FUN 是要应用的函数。
#计算向量中每个元素的平方根 numbers <- c(4, 9, 16, 25) sqrt_values <- sapply(numbers, sqrt) print(sqrt_values) # 输出每个元素的平方根 #输出结果为 [2, 3, 4, 5],表示每个元素的平方根。
(2)tapply
tapply(X, INDEX, FUN)
X 是要分组的数据;INDEX 是指定分组的因子或索引变量;FUN 是要应用的函数。
values <- c(10, 20, 30, 15, 25, 35) groups <- factor(c("A", "B", "A", "B", "A", "B")) mean_values <- tapply(values, groups, mean) print(mean_values) # 输出每个因子组的平均值 #输出结果为 A: 21.67, B: 23.33,表示每个因子组的平均值。
(3)sweep()
sweep(X, MARGIN, STATS, FUN)
X 是要进行操作的数组;
MARGIN 指定要操作的维度;
STATS 是用于操作的统计值;
FUN 指定要应用的操作函数。
matrix <- matrix(c(10, 20, 30, 40, 50, 60), nrow = 2) subtracted_matrix <- sweep(matrix, 2, 5, "-")#每个向量减去5(-5) print(subtracted_matrix) # 输出每列减去对应的值后的矩阵
17.is.na()和is.finite()
#is.na()判断向量每个元素是否NA is.na(c(1, NA, 3) > 2) ## [1] FALSE TRUE FALSE is.finite()判断向量每个元素是否Inf值 # 判断数值是否为正无穷大 y <- 10 is_infinite <- is.infinite(y) print(is_infinite) # 输出 FALSE
18.all.equal与identical()
#identical(x,y)比较两个R对象x与y的内容是否完全相同, 结果只会取标量TRUE与FALSE两种 identical(c(1,2,3), c(1,2,NA)) ## [1] FALSE identical(c(1L,2L,3L), c(1,2,3)) ## [1] FALSE #all.equal()与identical()类似, 但是在比较数值型时不区分整数型与实数型 #而且相同时返回标量TRUE, 但是不同时会返回一个说明有何不同的字符串 all.equal(c(1,2,3), c(1,2,NA)) ## [1] "'is.NA' value mismatch: 1 in current 0 in target" all.equal(c(1L,2L,3L), c(1,2,3)) ## [1] TRUE