本章在講解迴圈前,先講解R語言中使用條件判斷、交集(&)、聯集(|)、字元比較、c()
函數與單一數值比較的例子:
R語言 各類條件判斷
1. 條件判斷
# 單一條件
x <- 10
if (x > 5) {
print("x大於5")
} else {
print("x小於或等於5")
}
# 多重條件
x <- 10
if (x > 5 & x < 15) {
print("x在5和15之間")
} else {
print("x不在5和15之間")
}
2. 交集(&)
a <- TRUE
b <- FALSE
if (a & b) {
print("a和b都是TRUE")
} else {
print("a和b不是都為TRUE")
}
# 用於向量
vec1 <- c(TRUE, FALSE, TRUE)
vec2 <- c(TRUE, TRUE, FALSE)
result <- vec1 & vec2
print(result) # 結果:TRUE FALSE FALSE
3. 聯集(|)
a <- TRUE
b <- FALSE
if (a | b) {
print("a或b其中一個為TRUE")
} else {
print("a和b都為FALSE")
}
# 用於向量
vec1 <- c(TRUE, FALSE, TRUE)
vec2 <- c(TRUE, TRUE, FALSE)
result <- vec1 | vec2
print(result) # 結果:TRUE TRUE TRUE
4. 字元比較
str1 <- "apple"
str2 <- "banana"
if (str1 < str2) {
print("str1小於str2")
} else {
print("str1大於或等於str2")
}
# 字元向量比較
vec1 <- c("apple", "banana", "cherry")
vec2 <- c("banana", "apple", "cherry")
result <- vec1 == vec2
print(result) # 結果:FALSE FALSE TRUE
5. c()函數與單一數值比較
num <- 5
vec <- c(3, 5, 7, 9)
# 使用 %in% 檢查單一數值是否在向量中
if (num %in% vec) {
print("num存在於vec中")
} else {
print("num不存在於vec中")
}
# 比較整個向量
result <- vec == num
print(result) # 結果:FALSE TRUE FALSE FALSE
R語言 if else
以下是一些 if
和 if else
的範例
1. 單一條件的 if
x <- 10
if (x > 5) {
print("x大於5")
}
2. 單一條件的 if else
x <- 3
if (x > 5) {
print("x大於5")
} else {
print("x小於或等於5")
}
3. 多重條件的 if else if else
x <- 7
if (x > 10) {
print("x大於10")
} else if (x > 5) {
print("x大於5且小於或等於10")
} else {
print("x小於或等於5")
}
4. 巢狀 if else
x <- -3
if (x >= 0) {
if (x == 0) {
print("x等於0")
} else {
print("x是正數")
}
} else {
print("x是負數")
}
5. 使用向量的 ifelse
ifelse
是向量化的條件判斷函數,對向量中的每個元素進行條件判斷並返回結果。
x <- c(2, 6, 4, 9)
result <- ifelse(x > 5, "大於5", "小於或等於5")
print(result) # 結果: "小於或等於5" "大於5" "小於或等於5" "大於5"
6. 對數據框的條件判斷
df <- data.frame(name = c("Alice", "Bob", "Charlie"), score = c(85, 65, 70))
df$result <- ifelse(df$score >= 70, "通過", "未通過")
print(df)
輸出:
name score result
1 Alice 85 通過
2 Bob 65 未通過
3 Charlie 70 通過
7. 結合邏輯運算符的條件判斷
age <- 25
if (age >= 18 & age <= 65) {
print("適齡工作人口")
} else {
print("不在適齡工作範圍內")
}
which函數
which
函數在 R 中是一個非常有用的工具,用於識別滿足特定條件的向量元素的索引。這個函數返回一個整數向量,表示條件為 TRUE
的元素的位置。
基本語法
which(x)
其中 x
是一個邏輯向量(或可以被強制轉換為邏輯向量的向量)。
使用範例
1. 基本用法
vec <- c(3, 5, 8, 5, 2)
indices <- which(vec == 5)
print(indices) # 結果:2 4
在這個例子中,which
函數返回向量 vec
中等於 5
的元素的位置,即第 2 和第 4 個位置。
2. 配合條件使用
vec <- c(10, 15, 7, 22, 5)
indices <- which(vec > 10)
print(indices) # 結果:2 4
這裡 which
函數返回 vec
中大於 10
的元素的位置,即第 2 和第 4 個位置。
3. 用於數據框
假設有一個數據框,我們想找出某一列中滿足特定條件的行:
df <- data.frame(name = c("Alice", "Bob", "Charlie"), score = c(85, 65, 70))
indices <- which(df$score > 70)
print(indices) # 結果:1
這裡 which
函數返回數據框 df
的 score
列中大於 70
的行的位置,即第 1 行。
4. 結合其他函數
which
函數常與其他函數結合使用,以實現更複雜的數據操作:
vec <- c(3, 5, 8, 5, 2)
result <- vec[which(vec > 4)]
print(result) # 結果:5 8 5
這裡,我們先使用 which
函數找到大於 4
的元素的位置,然後使用這些位置來提取向量中的相應元素。
注意事項
which
函數返回的是索引,而不是元素本身。- 如果沒有元素滿足條件,
which
函數會返回一個長度為零的整數向量。
高級用法:arr.ind
參數
在多維數據(如矩陣或數組)中,which
函數還可以與 arr.ind
參數一起使用來返回多維索引:
mat <- matrix(1:9, nrow = 3)
indices <- which(mat > 5, arr.ind = TRUE)
print(indices)
輸出:
row col
[1,] 2 3
[2,] 3 1
[3,] 3 2
[4,] 3 3
這裡 which
函數返回矩陣 mat
中大於 5
的元素的位置,並以行列索引的形式返回。
R語言的for迴圈
基本語法
for (variable in sequence) {
# 要執行的代碼
}
其中,variable
是一個迭代變量,sequence
是一個向量、列表或其他可迭代的對象。
範例
1. 基本迴圈
for (i in 1:5) {
print(i)
}
這個範例將依次打印 1 到 5。
2. 迭代向量
vec <- c("apple", "banana", "cherry")
for (fruit in vec) {
print(fruit)
}
這個範例將依次打印向量 vec
中的每個元素。
3. 迭代列表
lst <- list(name = "Alice", age = 25, country = "USA")
for (item in lst) {
print(item)
}
這個範例將依次打印列表 lst
中的每個元素。
4. 迴圈中使用條件判斷
for (i in 1:10) {
if (i %% 2 == 0) {
print(paste(i, "是偶數"))
} else {
print(paste(i, "是奇數"))
}
}
這個範例將依次判斷 1 到 10 的數字是奇數還是偶數,並打印相應的結果。
5. 嵌套迴圈
matrix <- matrix(1:9, nrow = 3)
for (i in 1:nrow(matrix)) {
for (j in 1:ncol(matrix)) {
print(paste("matrix[", i, ",", j, "] = ", matrix[i, j], sep = ""))
}
}
這個範例將依次打印矩陣 matrix
中的每個元素及其位置。
6. 計算向量元素的平方
vec <- c(1, 2, 3, 4, 5)
squared_vec <- numeric(length(vec))
for (i in 1:length(vec)) {
squared_vec[i] <- vec[i]^2
}
print(squared_vec)
這個範例計算向量 vec
中每個元素的平方並存儲在 squared_vec
中。
7. 對數據框的迴圈操作
df <- data.frame(name = c("Alice", "Bob", "Charlie"), score = c(85, 65, 70))
for (i in 1:nrow(df)) {
if (df$score[i] >= 70) {
df$result[i] <- "通過"
} else {
df$result[i] <- "未通過"
}
}
print(df)
這個範例根據 score
列的值對數據框 df
添加一個 result
列,表示學生是否通過。
注意事項
for
迴圈適合用於需要逐個元素進行操作的情況,但在處理大規模數據時,向量化操作或使用apply
函數家族(如lapply
、sapply
等)通常更高效。- 當
for
迴圈嵌套過多時,代碼可讀性會降低,建議適當使用函數來簡化代碼結構。
舉例:輸出費波那契數列第20位
y = c(1, 1)
for (i in 1:18){
y[i+2] = y[i+1] + y[i]
}
print(y[20])
rep()函數
rep()
函數在 R 中用於生成重複的元素。這個函數非常靈活,可以用來創建重複的數字、字元、向量等。下面是 rep()
函數的基本語法及一些常見的使用範例。
基本語法
rep(x, times, length.out, each)
x
: 要重複的數據,可以是向量、數字、字元等。times
: 重複的次數。length.out
: 重複後的總長度。如果指定了length.out
,則times
參數將被忽略。each
: 每個元素重複的次數。
範例
1. 重複單一數字
result <- rep(5, times = 3)
print(result) # 結果:5 5 5
這個範例將數字 5
重複 3 次。
2. 重複向量
vec <- c(1, 2, 3)
result <- rep(vec, times = 2)
print(result) # 結果:1 2 3 1 2 3
這個範例將向量 vec
重複 2 次。
3. 使用 each
參數
vec <- c(1, 2, 3)
result <- rep(vec, each = 2)
print(result) # 結果:1 1 2 2 3 3
這個範例將向量 vec
中的每個元素重複 2 次。
4. 使用 length.out
參數
vec <- c(1, 2, 3)
result <- rep(vec, length.out = 5)
print(result) # 結果:1 2 3 1 2
這個範例將向量 vec
重複,直到總長度達到 5。
5. 重複字元
result <- rep("R", times = 4)
print(result) # 結果: "R" "R" "R" "R"
這個範例將字元 "R"
重複 4 次。
6. 混合使用 times
和 each
vec <- c("A", "B")
result <- rep(vec, times = 2, each = 3)
print(result) # 結果: "A" "A" "A" "B" "B" "B" "A" "A" "A" "B" "B" "B"
這個範例將向量 vec
中的每個元素重複 3 次,然後將結果重複 2 次。
進階應用
1. 生成序列
result <- rep(1:3, each = 2)
print(result) # 結果:1 1 2 2 3 3
這個範例生成了一個序列,其中每個數字都重複了 2 次。
2. 生成因子向量
factors <- factor(c("low", "medium", "high"))
result <- rep(factors, times = 3)
print(result)
這個範例將因子向量重複 3 次。