条件语句

if语句

只有if没有else,那么条件是FALSE时就什么都不做。

  1. > rm(list = ls())
  2. > i = -1
  3. > if (i<0) print('up')
  4. [1] "up"
  5. > if (i>0) print('up')

有else。

  1. > i =1
  2. > if (i>0){
  3. + print('+')
  4. + } else {
  5. + print("-")
  6. + }
  7. [1] "+"

ifelse函数

  1. > i =1
  2. > ifelse(i>0,"+","-")
  3. [1] "+"
  4. > x=rnorm(3)
  5. > ifelse(x>0,"+","-")
  6. [1] "+" "+" "-"

多个条件

  1. i = 0
  2. if (i>0){
  3. print('+')
  4. } else if (i==0) {
  5. print('0')
  6. } else if (i< 0){
  7. print('-')
  8. }
  9. ifelse(i>0,"+",ifelse((i<0),"-","0"))

循环语句

For循环

  1. > x <- c(5,6,0,3)
  2. > s=0
  3. > for (i in x){
  4. + s=s+i
  5. + print(c(i,s))
  6. + }
  7. [1] 5 5
  8. [1] 6 11
  9. [1] 0 11
  10. [1] 3 14
  11. > x <- c(5,6,0,3)
  12. > s = 0
  13. > for (i in 1:length(x)){
  14. + s=s+x[[i]]
  15. + print(c(x[[i]],s))
  16. + }
  17. [1] 5 5
  18. [1] 6 11
  19. [1] 0 11
  20. [1] 3 14

如何保存结果?

  1. > s = 0
  2. > result = list()
  3. > for(i in 1:length(x)){
  4. + s=s+x[[i]]
  5. + result[[i]] = c(x[[i]],s)
  6. + }
  7. > result
  8. [[1]]
  9. [1] 5 5
  10. [[2]]
  11. [1] 6 11
  12. [[3]]
  13. [1] 0 11
  14. [[4]]
  15. [1] 3 14
  16. > do.call(cbind,result)
  17. [,1] [,2] [,3] [,4]
  18. [1,] 5 6 0 3
  19. [2,] 5 11 11 14

隐式循环

主要学习apply()族函数的用法。

apply

apply(X, MARGIN, FUN, …) 其中X是数据框/矩阵名; MARGIN为1表示行,为2表示列,FUN是函数

  1. > rm(list = ls())
  2. > test<- iris[1:6,1:4]
  3. > apply(test, 2, mean)
  4. Sepal.Length Sepal.Width Petal.Length Petal.Width
  5. 4.9500000 3.3833333 1.4500000 0.2333333
  6. > apply(test, 1, sum)
  7. 1 2 3 4 5 6
  8. 10.2 9.5 9.4 9.4 10.2 11.4

lapply

列表/向量中的每个元素(向量)实施相同的操作

  1. > test <- list(x = 36:33,y = 32:35,z = 30:27)
  2. > test
  3. $x
  4. [1] 36 35 34 33
  5. $y
  6. [1] 32 33 34 35
  7. $z
  8. [1] 30 29 28 27
  9. > lapply(test,mean)
  10. $x
  11. [1] 34.5
  12. $y
  13. [1] 33.5
  14. $z
  15. [1] 28.5
  16. > lapply(test,fivenum)
  17. $x
  18. [1] 33.0 33.5 34.5 35.5 36.0
  19. $y
  20. [1] 32.0 32.5 33.5 34.5 35.0
  21. $z
  22. [1] 27.0 27.5 28.5 29.5 30.0

sapply

简化lapply()结果,直接返回矩阵或向量

  1. > test
  2. $x
  3. [1] 36 35 34 33
  4. $y
  5. [1] 32 33 34 35
  6. $z
  7. [1] 30 29 28 27
  8. > sapply(test,mean)
  9. x y z
  10. 34.5 33.5 28.5
  11. > sapply(test,fivenum)
  12. x y z
  13. [1,] 33.0 32.0 27.0
  14. [2,] 33.5 32.5 27.5
  15. [3,] 34.5 33.5 28.5
  16. [4,] 35.5 34.5 29.5
  17. [5,] 36.0 35.0 30.0
  18. > class(sapply(test,fivenum))
  19. [1] "matrix" "array"