跳转到内容

R 编程/控制结构

来自维基教科书,开放的书籍,为开放的世界

条件执行

[编辑 | 编辑源代码]
  • 编程帮助
> ?Control

if接受一维条件。

> if (condition){
+     statement  
+     } 
> else{
+     alternative
+     }

一维条件可以是以下之一:TRUE或者FALSE, T或者F, 1或者0或者使用真值运算符的语句

  • x == y"x 等于 y"
  • x != y"x 不等于 y"
  • x > y"x 大于 y"
  • x < y"x 小于 y"
  • x <= y"x 小于或等于 y"
  • x >= y"x 大于或等于 y"

并且可以使用&或者&&运算符表示 AND。|或者||是 OR 的运算符。

> if(TRUE){
+     print("This is true")
+     }
  [1] "This is true"
> x <- 2  # x gets the value 2
> if(x==3){
+     print("This is true")
+     } else {
+     print("This is false")
+     }
 [1] "This is false"
> y <- 4 # y gets the value 4
> if(x==2 && y>2){
+     print("x equals 2 and y is greater than 2")
+     }
 [1] "x equals 2 and y is greater than 2"

ifelse()命令以条件作为第一个参数,如果条件为真则以处理结果作为第二个参数,如果条件为假则以处理结果作为第三个参数。在这种情况下,条件可以是向量。例如,我们生成一个从 1 到 10 的序列,我们想要显示小于 5 且大于 8 的值。

> x <- 1:10 
> ifelse(x<5 | x>8, x, 0)
 [1]  1  2  3  4  0  0  0  0  9 10

R 提供了一些非常有用的集合处理程序来选择向量的一个子集

> x = runif(10)
> x<.5
 [1]  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
> x
 [1] 0.32664759 0.57826623 0.98171138 0.01718607 0.24564238 0.62190808 0.74839301 
 [8] 0.32957783 0.19302650 0.06013694
> x[x<.5]
[1] 0.32664759 0.01718607 0.24564238 0.32957783 0.19302650 0.06013694

排除向量的一个子集

> x = 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> x[-1:-5]
[1]  6  7  8  9 10

隐式循环

[编辑 | 编辑源代码]
使用矢量化的快速代码示例

R 支持隐式循环,称为矢量化。这被内置到许多函数和标准运算符中。例如,+ 运算符可以添加两个数字数组,而无需显式循环。

隐式循环通常很慢,最好在可能的情况下避免它们。

  • apply()可以将函数应用于矩阵或数组的元素。这可能是矩阵的行 (1) 或列 (2)。
  • lapply()将函数应用于数据框的每一列,并返回一个列表。
  • sapply()类似但输出已简化。它可能是一个向量或一个矩阵,具体取决于函数。
  • tapply()为每个因素级别应用函数。
> N <- 10
> x1 <- rnorm(N)
> x2 <- rnorm(N) + x1 + 1
> male <- rbinom(N,1,.48)
> y <- 1 + x1 + x2 + male + rnorm(N)
> mydat <- data.frame(y,x1,x2,male)
> lapply(mydat,mean) # returns a list
$y
[1] 3.247

$x1
[1] 0.1415

$x2
[1] 1.29

$male
[1] 0.5

> sapply(mydat,mean) # returns a vector
     y     x1     x2   male 
3.2468 0.1415 1.2900 0.5000 
> apply(mydat,1,mean) # applies the function to each row
 [1]  1.1654  2.8347 -0.9728  0.6512 -0.0696  3.9206 -0.2492  3.1060  2.0478  0.5116
> apply(mydat,2,mean) # applies the function to each column
     y     x1     x2   male 
3.2468 0.1415 1.2900 0.5000 
> tapply(mydat$y,mydat$male,mean) # applies the function to each level of the factor
    0     1 
1.040 5.454
  • 另请参阅aggregate()tapply()类似,但应用于数据框而不是向量。

显式循环

[编辑 | 编辑源代码]

R 提供三种编写循环的方法:for、repeat 和 while。这for语句非常简单。您只需要定义索引(此处为 k)和一个向量(在下面的示例中,向量为 1:5),然后指定您想要在括号之间执行的操作。

> for (k in 1:5){
+ print(k)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

当无法使用 for 语句时,您还可以通过指定中断规则来使用 break 或 while。应该谨慎使用这种循环,因为如果中断规则指定错误,循环将永远不会结束。在下面的两个示例中,只要值低于 1,就会绘制标准正态分布。cat() 函数用于在屏幕上显示当前值。

> repeat { 
+ 	g <- rnorm(1) 
+ 	if (g > 1.0) break 
+ 	cat(g,"\n")
+ 	} 
-1.214395 
0.6393124 
0.05505484 
-1.217408 
> g <- 0
> while (g < 1){
+ 	g <- rnorm(1) 
+ 	cat(g,"\n")
+ 	}
-0.08111594 
0.1732847 
-0.2428368 
0.3359238 
-0.2080000 
0.05458533 
0.2627001 
1.009195

next 语句可用于中止一个特定的循环并跳到“下一个”。

> for (k in 1:10) { 
+   if(k==8) {
+     print("skipped")
+     next
+   }
+   print(k)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] "skipped"
[1] 9
[1] 10

迭代器

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
上一页:随机数生成 索引 下一页:数据管理
华夏公益教科书