R 编程/高级编程
外观
< R 编程
- 编程帮助
> ?Control
if接受一维条件。
if (condition){ statement } else { alternative }
该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 提供三种编写循环的方法: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
循环通常很慢,最好在可能的情况下避免它们。
- 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 中的循环通常很慢。迭代器可能比循环更有效。 查看 Revolution Computing 博客 中的此条目。