R語言教學3 if else , which(), 迴圈, rep()

本章在講解迴圈前,先講解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

以下是一些 ifif 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 函數返回數據框 dfscore 列中大於 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 函數家族(如 lapplysapply 等)通常更高效。
  • 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. 混合使用 timeseach

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 次。

Back to Blog pytorch連結

返回頂端