R 编程/控制结构
外观
< 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
- R 中的循环通常很慢。迭代器可能比循环更有效。请参阅 Revolution Computing 博客 中的此条目