R For 循环

本文通过介绍语法和简单示例,帮助您了解 R for 循环的重要性及优点。接下来,我们将介绍嵌套 for 循环和一些实际问题。阅读本文后,您应该能够理解 For 循环及其在日常工作中的有效使用方法。

在任何编程语言中,For 循环都会遍历一系列项或值并重复执行代码。例如,对向量执行简单的计算。R 中 for 循环的简单单行语法提高了可读性和可维护性。此外,它还减少了执行重复任务所需的代码量。

R For 循环遍历不同数据结构并重复执行任务的能力使其成为数据分析、科学计算等领域的宝贵工具。但是,在处理大型数据集时要小心。它最常见的用途如下。

  1. 重复执行给定次数。
  2. 访问和操作向量、矩阵或数据框元素。
  3. 进行计算。例如,计算数值序列的总和、平均值、阶乘等。
  4. 生成基于公式的模式或值序列。

R For 循环语法

它会重复执行一组语句,直到向量中没有项目为止。它遵循包含初始化、条件和递增初始化组件的特定语法。此编程语言中 for 循环的基本语法是。

for(val in vector)  {
     Statement 1
     Statement 2
     ………
     Statement N
}

如果观察到上面 for 循环的语法,向量可以是字符串、整数或任何您想迭代的内容。

  • 它以一个对象开始,这意味着它将遍历一个向量并将第一个项赋给一个值。例如,值为 A: E,将 A 赋给 val。
  • 接下来,它将执行 For 循环内的语句。
  • 完成语句后,它将转到向量并将下一个值赋给 val。
  • 该过程将重复进行,直到没有项目为止。

R 编程中的 For 循环流程图

下面的屏幕截图将向您展示 For 循环背后的流程图。

For loop Flow Chart

R For 循环示例

此示例将解释其在整数上的工作功能。在此示例中,num 是初始化组件,1:10 是序列。程序将 num 变量初始化为 1:10 序列的第一个值,即 1。

接下来,for 循环将遍历该序列,并将每个数字乘以 9,直到 num 变量达到 10(小于或等于 10)。每次迭代后,num 变量会增量到序列中的下一个值,即 2、3、4、5、6、7、8、9、10。

numbers <- c(1:10)

for (num in numbers) {
  print(9 * num)
}
print("---- This is Coming from Outside ---")
R For loop Example 2

for 循环初始化示例

在下面的示例中,我们在代码开头或 for 循环开始之前将 i 初始化为 0。但是,R for 循环将覆盖 i 变量并将其重新分配给序列的第一个值,即 3。

i <- 0

for (i in 3:5) {
  print(5 * i)
}
[1] 15
[1] 20
[1] 25

递增示例

我们不必使用冒号运算符,而是可以使用 seq() 函数在 for 循环中生成数字序列。seq() 函数有一个 step 参数,允许您添加步长或递增初始化变量。

下面的示例从 1 开始,以 2 递增变量 i,并打印 1 到 10 之间的每个交替数字。

for (i in seq(1, 10, by = 2)) {
 print(i)
}
[1] 1
[1] 3
[1] 5
[1] 7
[1] 9

递减示例

下面的 for 循环程序代码从 10 开始,以 2(by = -2)递减 i 变量,并打印 10 到 2 之间的每个交替数字。

for (i in seq(10, 1, by = -2)) {
 print(i)
}
[1] 10
[1] 8
[1] 6
[1] 4
[1] 2

R For 循环遍历字符串范围

此示例将解释此 for 循环如何从向量中提取单个项或数据。在此 R 编程 示例中,我们声明了 Countries 并分配了以下值。

在这里,我们使用 for 循环遍历 Countries 向量并显示每个项。在下一行,我们在其外部使用了一个 print 语句。该语句将在编译器退出后执行。

countries <- c('India', 'U K', 'Japan', 'U S A', 'Australia', 'China')

for (str in countries) {
  print(paste("Countries are:  ", str))
}
print("----This is Coming from Outside ---")
R For Loop Example 3

从上面的屏幕截图可以看出,我们在第二个 R for 循环示例代码中使用了 Countries 列表。

countries <- c('India', 'U K', 'Japan', 'U S A', 'Australia', 'China')

第一次迭代

  • 第一次迭代,Country = 'India'。
  • 这意味着向量中有一些项,因此它将执行循环内的 print 语句。

第二次迭代

  • 第二次迭代,Country = 'U K'。
  • 这意味着向量中有一些项,因此它将执行内部的 print。

第三次迭代

  • Country = 'Japan'。
  • 这意味着有一些项,因此它将执行语句。

第四次迭代

  • Country = 'U S A'。
  • 这意味着向量中有一些项,因此它将执行 print 语句。

第五次迭代

  • Country = 'Australia',条件已测试。
  • 这意味着存在一些项,因此它将执行 print 语句。

第六次迭代

  • Country = 'China'。
  • 这意味着向量中有一些项将编译内部的 print 语句。

在下一次迭代中,此项中没有要分配给 Country 变量的项。因此,它将退出。

R 编程中的嵌套 For 循环

R 编程语言允许您将一个循环嵌套在另一个循环中以遍历多级数据(数组、矩阵、数据框等)。内层循环将在外层或主循环的每次迭代中完全执行。由于这种嵌套方法,您可以执行更复杂的迭代并访问多层信息。

我将编写一个乘法表程序,以便您了解嵌套 For 循环。此示例打印高达 5 的乘法表。在这里,外部循环 (for (i in 1:10)) 从 1 迭代到 10,内层循环从 1 迭代到 5。

for (i in 1:10) {
 for (j in 1:5) {
  result <- i * j
  cat(result, "\t")
 }
 cat("\n")
} 
1 	2 	3 	4 	5 	
2 	4 	6 	8 	10 	
3 	6 	9 	12 	15 	
4 	8 	12 	16 	20 	
5 	10 	15 	20 	25 	
6 	12 	18 	24 	30 	
7 	14 	21 	28 	35 	
8 	16 	24 	32 	40 	
9 	18 	27 	36 	45 	
10 	20 	30 	40 	50 

下一节将介绍嵌套 for 循环处理矩阵的实际示例。

R For 循环内的 If else 语句

当您在其中结合条件语句(如 if 条件和 if else)时,for 循环会变得更加强大。

要检查特定条件,您可以将 If Else 语句 包含在 For 循环中。根据结果,我们可以控制执行流程。通过这种方式,您可以执行不同的操作。

在下面的示例中,for 循环从 1 迭代到 10。if 条件检查数字除以二的余数是否等于零。如果为 True,则打印为偶数;否则,打印为奇数。

for (i in 10:15) {
 if (i %% 2 == 0) {
  print(paste(i, "is Even"))
 } else {
  print(paste(i, "is Odd"))
 }
}
[1] "10 is Even"
[1] "11 is Odd"
[1] "12 is Even"
[1] "13 is Odd"
[1] "14 is Even"
[1] "15 is Odd"

使用 break 和 next 语句控制 R For 循环

我们可以使用以下任一语句来操作 for 循环的执行流程。

for 循环 next 语句示例

当基于某些条件跳过一些 for 循环迭代时,next 语句很有用,因为它会跳过当前迭代中的代码并继续到下一个迭代。

在此示例中,如果 i %%2 不等于 0,next 语句将跳过包含 print() 的迭代并转到下一个迭代。

for (i in 1:10) {
 if (i %%2 != 0) {
  next
 }
 print(i)
}
[1] 2
[1] 4
[1] 6
[1] 8
[1] 10

for 循环 break 语句示例

当基于特定条件退出或终止 for 循环时,break 语句很有用。例如,当表达式为 true 时停止整个迭代过程是有益的。

for (i in 1:5) {
 if (i == 3) {
  break
 }
 print(i)
}
[1] 1
[1] 2

R For 循环遍历向量、矩阵和数据框

以下示例帮助您了解如何使用 for 循环遍历元素并打印输出。

For 循环访问矩阵的行和列

我们需要嵌套 for 循环来访问和更新或操作矩阵项。因为嵌套 For 循环有助于遍历矩阵的每一行和每一列,以执行逐行或逐列的操作,从而可以访问和操作 矩阵 项。

矩阵有行和列,此编程语言中的嵌套 For 循环遍历每一行,并在每一行内遍历该行的每一列。让我用一个矩阵示例来帮助您理解。

我们声明了一个 3x4 的矩阵,包含从 1 到 12 的数字。外层循环迭代行索引(3 次),内层循环迭代列索引(4 次)。通过使用索引位置 matrix[i, j],我们正在访问矩阵的各个元素。

mat <- matrix(c(1:12), 3, 4)
print(mat)

for (i in 1:nrow(mat)) {
 for (j in 1:ncol(mat)) {
  cat(i, ",", j, " = ", mat[i, j], "\t")
 }
 cat("\n")
}
1 , 1  =  1 	1 , 2  =  4 	1 , 3  =  7 	1 , 4  =  10 	
2 , 1  =  2 	2 , 2  =  5 	2 , 3  =  8 	2 , 4  =  11 	
3 , 1  =  3 	3 , 2  =  6 	3 , 3  =  9 	3 , 4  =  12 

如何使用 for 循环访问向量项?

您可以使用 R For 循环遍历每个向量元素并根据需要进行访问或操作。虽然我们可以执行复杂的计算,但我们提供了一个简单的示例,以便您更好地理解。

在此示例中,我们声明了一个 numbers 向量 和 sum 变量。接下来,for 循环遍历每个向量元素,从 5 到 40。最后,在循环内 (sum <- sum + n),我们将向量项添加到 sum 变量以计算所有项的总和。

numbers <- c(5, 10, 15, 20, 25, 30, 35, 40)
sum <- 0

for (n in numbers) {
 sum <- sum + n
}

print(sum)
[1] 180

如何使用 for 循环访问数据框的行和列?

使用 For 循环,您可以遍历 数据框 的行和列,访问和操作数据,应用函数等。

employee <- data.frame(Id = c(1:5),
Name = c("John", "Rob", "Christy", "Johnson", "Miller"),
Occupation = c("Professional", "Management", "Developer", "Programmer", "Admin"),
Salary = c(80000, 90000, 75000, 92000, 82000))

for (i in 1:nrow(employee)) {
 ID <- employee$Id[i]
 Name <- employee$Name[i]
 Occupation <- employee$Occupation[i]
 Salary <- employee$Salary[i]
  
 cat("ID:", ID, "\n")
 cat("Name:", Name, "\n")
 cat("Age:", Occupation, "\n")
 cat("Country:", Salary, "\n")
 cat("\n")
}
ID: 1 
Name: John 
Age: Professional 
Country: 80000 

ID: 2 
Name: Rob 
Age: Management 
Country: 90000 

ID: 3 
Name: Christy 
Age: Developer 
Country: 75000 

ID: 4 
Name: Johnson 
Age: Programmer 
Country: 92000 

ID: 5 
Name: Miller 
Age: Admin 
Country: 82000 

循环的最佳实践和技巧

  1. 确保正确设置开始和结束条件。
  2. 通过提供适当的终止条件避免无限循环。
  3. 始终检查 seq() 函数的 step 参数符号。
  4. 避免将它们用于复杂操作。
  5. 使用向量化函数而不是 for 循环,后者可以有效地对整个向量或矩阵执行操作。