R語言程式設計藝術 第2章 向量(上)

weixin_34138377發表於2019-01-25

2.1 標量、向量、陣列與矩陣

向量長度:length()
矩陣、陣列本質上是向量。

2.2 宣告

變數可以直接賦值,無需提前生命,但是不可以直接引用向量中的元素,即不可以突然冒出y[2]。

2.3 迴圈補齊

在對兩個向量使用運算子時,如果要求這兩個向量具有相同的長度,R會自動迴圈補齊(recycle),即重複較短的向量,直到它與另一個向量長度相匹配。
例子:

9475888-14152dcc870a3c0a.png

矩陣也是迴圈補齊的:
9475888-6d3cd15d6826dcb7.png

2.4 常用的向量運算

向量運算,是兩個向量對應位置的子元素逐一運算。
向量索引,取子集操作x[c(1,3)]
建立向量:
“:”生成指定範圍內數值構成的向量。
seq()(由sequence得來),用來生成等差序列
rep()重複向量常數,引數times指定整體重複次數,each指定每個元素重複次數。

2.5 使用all()和any()

any() 和all() 函式分別報告其引數是否至少有一個或全部為TRUE,返回邏輯值。
擴充套件案例:尋找連續出現1 的遊程

findruns <- function(x,k) {
   n <- length(x)
   runs <- NULL
   for (i in 1:(n-k+1)) {
      if (all(x[i:(i+k-1)]==1)) runs <- c(runs,i)
   }
   return(runs)
}

為提高運算速度,預先分配記憶體空間

findruns1 <- function(x,k) {
   n <- length(x)
   runs <- vector(length=n)
   count <- 0
   for (i in 1:(n-k+1)) {
      if (all(x[i:(i+k-1)]==1)) {
         count <- count + 1
         runs[count] <- i
      }
   }
   if (count > 0) {
      runs <- runs[1:count]
   } else runs <- NULL
   return(runs)
}

2.6 向量化運算子

多數函式是向量輸入,向量輸出。sapply可實現向量輸入,矩陣輸出。如果要把輸入限制為標量:

 function(x,c) {
  if (length(c)!=1) stop("vector c not allowed")
  return((x+c)^2)
}

相關文章