變數資料結構和基本操作

在 R 中,使用命名資料結構來運算元據物件。物件的名稱可能被稱為變數,儘管該術語在官方 R 文件中沒有特定含義。R 名稱區分大小寫,可能包含字母數字字元(a-zA-z0-9),點/句點(.)和下劃線(_)。要為資料結構建立名稱,我們必須遵循以下規則:

  • 以數字或下劃線開頭的名稱(例如 1a),或有效數字表示式的名稱(例如 .11),或帶有破折號(’ - ‘)或空格的名稱只能在引用時使用:`1a``.11`。名稱將使用反引號列印:

     list( '.11' ="a")
     #$`.11`
     #[1] "a"
    
  • 可以自由使用字母數字字元,點和下劃線的所有其他組合,其中帶或不帶反引號的引用指向同一物件。

  • . 開頭的名稱被視為系統名稱,並且使用 ls()-function 並不總是可見。

變數名中的字元數沒有限制。

有效物件名稱的一些示例是:foobarfoo.barfoo_bar.foobar

在 R 中,使用中綴賦值運算子 <- 為變數賦值。運算子 = 也可用於為變數賦值,但其正確用途是將值與函式呼叫中的引數名相關聯。請注意,省略運算子周圍的空格可能會給使用者造成混淆。表示式 a<-1 被解析為賦值(a <- 1)而不是邏輯比較(a < -1)。

> foo <- 42
> fooEquals = 43

所以 foo 被分配了 42 的值。在控制檯中輸入 foo 將輸出 42,輸入 fooEquals 將輸出 43

> foo
[1] 42
> fooEquals
[1] 43

以下命令為名為 x 的變數賦值,並同時列印該值:

> (x <- 5) 
[1] 5
# actually two function calls: first one to `<-`; second one to the `()`-function
> is.function(`(`)
[1] TRUE  # Often used in R help page examples for its side-effect of printing.

也可以使用 -> 對變數進行賦值。

> 5 -> x
> x
[1] 5
> 

資料結構的型別

R 中沒有標量資料型別。長度為 1 的向量就像標量一樣。

  • 向量:原子向量必須是同類物件的序列:數字序列,或邏輯序列或字元序列。v <- c(2, 3, 7, 10)v2 <- c("a", "b", "c") 都是向量。
  • 矩陣:數字,邏輯或字元的矩陣。a <- matrix(data = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), nrow = 4, ncol = 3, byrow = F)。與向量一樣,矩陣必須由相同類別的元素組成。要從矩陣中提取元素,必須指定行和列:a[1,2] 返回 [1] 5,它是第一行,第二列的元素。
  • 列表:不同元素的串聯 mylist <- list (course = 'stat', date = '04/07/2009', num_isc = 7, num_cons = 6, num_mat = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), results = c(30, 19, 29, NA, 25, 26 ,27) )。從列表中提取元素可以通過名稱(如果列表已命名)或通過索引完成。在給定的示例中,mylist$resultsmylist[[6]] 獲得相同的元素。警告:如果你嘗試 mylist[6],R 不會給你一個錯誤,但它會將結果作為列表提取。雖然允許使用 mylist[[6]][2](它給你 19),但 mylist[6][2] 會給你一個錯誤。
  • data.frame:具有相等長度但(可能)不同型別的向量的列的物件。它們不是矩陣。exam <- data.frame(matr = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), res_S = c(30, 19, 29, NA, 25, 26, 27), res_O = c(3, 3, 1, NA, 3, 2, NA), res_TOT = c(30,22,30,NA,28,28,27))。列可以通過名稱 exam$matrexam[, 'matr'] 或通過索引 exam[1]exam[,1] 讀取。也可以通過名稱 exam['rowname', ] 或 index exam[1,] 讀取行。資料幀實際上只是具有特定結構的列表(rownames-attribute 和等長元件)

常見操作和一些警示性建議

預設操作是逐個元素完成的。有關運算子優先順序的規則,請參見 ?Syntax。大多數運算子(以及基數 R 中的其他函式)具有允許不等長的引數的迴圈規則。鑑於這些物件:

示例物件

> a <- 1
> b <- 2
> c <- c(2,3,4)
> d <- c(10,10,10)
> e <- c(1,2,3,4)
> f <- 1:6
> W <- cbind(1:4,5:8,9:12)
> Z <- rbind(rep(0,3),1:3,rep(10,3),c(4,7,1))

一些向量運算

> a+b # scalar + scalar
[1] 3
> c+d # vector + vector
[1] 12 13 14
> a*b # scalar * scalar 
[1] 2
> c*d # vector * vector (componentwise!)
[1] 20 30 40
> c+a # vector + scalar
[1] 3 4 5
> c^2 # 
[1]  4  9 16
> exp(c) 
[1]  7.389056 20.085537 54.598150

一些向量操作警告!

> c+e # warning but.. no errors, since recycling is assumed to be desired.
[1] 3 5 7 6
Warning message:
In c + e : longer object length is not a multiple of shorter object length

R 總結它可以然後重新使用較短的向量來填充空白……僅僅因為兩個向量的長度不是精確的倍數而給出警告。c + f#沒有任何警告。

一些 Matrix 操作警告!

> Z+W # matrix + matrix #(componentwise)
> Z*W # matrix* matrix#(Standard product is always componentwise)

使用矩陣乘法:V%*%W

> W + a # matrix+ scalar is still componentwise
     [,1] [,2] [,3]
[1,]    2    6   10
[2,]    3    7   11
[3,]    4    8   12
[4,]    5    9   13

> W + c # matrix + vector... : no warnings and R does the operation in a column-wise manner
     [,1] [,2] [,3]
[1,]    3    8   13
[2,]    5   10   12
[3,]    7    9   14
[4,]    6   11   16

私人變數

R 中變數或函式名稱中的前導點通常用於表示變數或函式是隱藏的。

因此,宣告以下變數

> foo <- 'foo'
> .foo <- 'bar'

然後使用 ls 函式列出物件只會顯示第一個物件。

> ls()
[1] "foo"

但是,將 all.names = TRUE 傳遞給函式將顯示’private’變數

> ls(all.names = TRUE)
[1] ".foo"          "foo"