R 程式設計/資料型別
向量(Vectors)是 R 中最簡單的物件,一個給定型別(例如實數、字串、邏輯值)的原始 R 物件的有序列表。向量由從 1 開始的整數索引。因子(Factors)類似於向量,但每個元素都是分類的,即固定數量的可能性之一(或水平(levels))。矩陣(Matrix)類似於向量,但具有特定的佈局指令,使其看起來像一個矩陣,即元素由兩個整數索引,每個整數都從 1 開始。陣列(Arrays)類似於矩陣,但可以具有超過 2 個維度。列表(List)類似於向量,但元素不必都屬於同一型別。列表的元素可以透過整數或命名字串進行索引,即 R 列表可以用來實現其他語言中所謂的“關聯陣列”、“雜湊表”、“對映”或“字典”。資料框(Dataframe)類似於矩陣,但不假設所有列都具有相同的型別。資料框是相同長度的變數/向量的列表。類(Classes)定義了特定型別物件(objects)的外觀。類作為屬性(attribute)附加到物件。所有 R 物件都具有類、型別和維度。
> class(object)
> typeof(object)
> dim(object)
您可以使用c()函式建立向量,該函式連線一些元素。您可以使用:符號或seq()函式建立序列。例如1:5給出 1 到 5 之間的所有數字。該seq()函式允許您指定連續數字之間的間隔。您還可以使用rep()函式重複模式。您還可以使用numeric()建立缺失值的數值向量,使用character()建立缺失值的字元向量,以及使用FALSE的邏輯向量建立缺失值(即)logical()
> c(1,2,3,4,5)
[1] 1 2 3 4 5
> c("a","b","c","d","e")
[1] "a" "b" "c" "d" "e"
> c(T,F,T,F)
[1] TRUE FALSE TRUE FALSE
> 1:5
[1] 1 2 3 4 5
> 5:1
[1] 5 4 3 2 1
> seq(1,5)
[1] 1 2 3 4 5
> seq(1,5,by=.5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> rep(1,5)
[1] 1 1 1 1 1
> rep(1:2,5)
[1] 1 2 1 2 1 2 1 2 1 2
> numeric(5)
[1] 0 0 0 0 0
> logical(5)
[1] FALSE FALSE FALSE FALSE FALSE
> character(5)
[1] "" "" "" "" ""
該length()計算向量的長度。last()(sfsmisc) 返回向量的最後一個元素,但這也可以在無需額外包的情況下簡單地實現。
x <- seq(1,5,by=.5) # Create a sequence of number
x # Display this object
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> length(x) # Get length of object x
[1] 9
> library(sfsmisc)
> last(x) # Select the last element of x
[1] 5.0
> x[length(x)] # Select the last element wihout an extra package.
[1] 5.0
factor()將向量轉換為因子。因子也可以使用選項進行排序ordered=T或函式ordered(). levels()返回因子的水平。gl()生成因子。n是水平的數量,k每個因子的重複次數,以及length因子的總長度。labels是可選的,併為每個水平提供標籤。
因子最容易被認為是分類變數。因子分析的一個重要函式是table()函式,它提供了一種摘要型別。在考慮統計資料型別(名義、有序、區間和比率)時,因子可以是名義、有序或區間。名義因子是分類名稱,例如與某些其他資訊配對的國家名稱。有序因子的一個例子是特定運動員的一組比賽時間,以及與運動員的完成位置(第一名、第二名等)配對。在嘗試總結此因子時,請參閱下面關於有序示例的示例,瞭解有關自行排序因子的示例。最後,區間級因子的一個示例是年齡組,例如“20-29”、“30-39”等。通常,R 可以自動適當地對儲存為因子的數字進行排序,但程式設計師可以使用相同的方法處理此類資料,以使其以最適合其應用程式的方式進行排序。
另請參閱is.factor(), as.factor(), is.ordered()和as.ordered().
> factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"))
[1] yes no yes maybe maybe no maybe no no
Levels: maybe no yes
>
> factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"), ordered = T)
[1] yes no yes maybe maybe no maybe no no
Levels: maybe < no < yes
>
> ordered(c("yes","no","yes","maybe","maybe","no","maybe","no","no"))
[1] yes no yes maybe maybe no maybe no no
Levels: maybe < no < yes
>
> ordered(as.factor(c("First","Third","Second","Fifth","First","First","Third")),
+ levels = c("First","Second","Third","Fourth","Fifth"))
[1] First Third Second Fifth First First Third
Levels: First < Second < Third < Fourth < Fifth
>
> gl(n=2, k=2, length=10, labels = c("Male", "Female")) # generate factor levels
[1] Male Male Female Female Male Male Female Female Male Male
Levels: Male Female
- 如果要建立一個新矩陣,一種方法是使用matrix()函式。您必須輸入一個數據向量、行數和/或列數,最後您可以指定是否希望 R 按行或按列讀取您的向量(預設選項)。以下為兩個示例。
> matrix(data = NA, nrow = 5, ncol = 5, byrow = T)
[,1] [,2] [,3] [,4] [,5]
[1,] NA NA NA NA NA
[2,] NA NA NA NA NA
[3,] NA NA NA NA NA
[4,] NA NA NA NA NA
[5,] NA NA NA NA NA
> matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 1 2 3 4 5
[5,] 6 7 8 9 10
- 函式cbind()和rbind()以列對列或行對行模式將向量組合成矩陣
> v1 <- 1:5
> v2 <- 5:1
> v2
[1] 5 4 3 2 1
> cbind(v1,v2)
v1 v2
[1,] 1 5
[2,] 2 4
[3,] 3 3
[4,] 4 2
[5,] 5 1
> rbind(v1,v2)
[,1] [,2] [,3] [,4] [,5]
v1 1 2 3 4 5
v2 5 4 3 2 1
- 可以使用dim()函式獲取矩陣的維度。或者nrow()和ncol()返回矩陣中的行數和列數
> X <- matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T)
> dim(X)
[1] 5 5
> nrow(X)
[1] 5
> ncol(X)
[1] 5
- 函式t()轉置矩陣
> t(X)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 1 6
[2,] 2 7 12 2 7
[3,] 3 8 13 3 8
[4,] 4 9 14 4 9
[5,] 5 10 15 5 10
- 與資料框不同,矩陣必須是數值型或字元型。
> a=matrix(2,2,2)
> a
[,1] [,2]
[1,] 2 2
[2,] 2 2
> a = rbind(a,c("A","A"))
> a
[,1] [,2]
[1,] "2" "2"
[2,] "2" "2"
[3,] "A" "A"
陣列由 n 個維度組成,每個維度都是相同型別 R 物件的向量。可以如下構造一個具有一個元素的一維陣列。
> x <- array(c(T,F),dim=c(1))
> print(x)
[1] TRUE
陣列 x 是使用從可能值向量 c(T,F) 中提取的單個維度 (dim=c(1)) 建立的。可以使用單個維度和兩個值建立類似的陣列 y。
> y <- array(c(T,F),dim=c(2))
> print(y)
[1] TRUE FALSE
可以如下建立三維陣列 - 3x3x3 -。
> z <- array(1:27,dim=c(3,3,3))
> dim(z)
[1] 3 3 3
> print(z)
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18
, , 3
[,1] [,2] [,3]
[1,] 19 22 25
[2,] 20 23 26
[3,] 21 24 27
R 陣列的訪問方式類似於其他語言中的陣列:透過整數索引,從 1 開始(而不是 0)。以下程式碼顯示瞭如何訪問 3x3x3 陣列的第三個維度。第三個維度是一個 3x3 陣列。
> z[,,3]
[,1] [,2] [,3]
[1,] 19 22 25
[2,] 20 23 26
[3,] 21 24 27
指定三個維度中的兩個會返回一個一維陣列。
> z[,3,3]
[1] 25 26 27
指定三個維度中的三個會返回 3x3x3 陣列的一個元素。
> z[3,3,3]
[1] 27
可以進行更復雜的陣列分割槽。
> z[,c(2,3),c(2,3)]
, , 1
[,1] [,2]
[1,] 13 16
[2,] 14 17
[3,] 15 18
, , 2
[,1] [,2]
[1,] 22 25
[2,] 23 26
[3,] 24 27
陣列不必在所有維度上都是對稱的。以下程式碼建立了一對 3x3 陣列。
> w <- array(1:18,dim=c(3,3,2))
> print(w)
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18
組成陣列的向量的物件必須是相同型別,但不必是數字。
> u <- array(c(T,F),dim=c(3,3,2))
> print(u)
, , 1
[,1] [,2] [,3]
[1,] TRUE FALSE TRUE
[2,] FALSE TRUE FALSE
[3,] TRUE FALSE TRUE
, , 2
[,1] [,2] [,3]
[1,] FALSE TRUE FALSE
[2,] TRUE FALSE TRUE
[3,] FALSE TRUE FALSE
列表是 R 物件的集合。list()建立列表。unlist()將列表轉換為向量。列表中的物件不必具有相同的型別或長度。
> x <- c(1:4)
> y <- FALSE
> z <- matrix(c(1:4),nrow=2,ncol=2)
> myList <- list(x,y,z)
> myList
[[1]]
[1] 1 2 3 4
[[2]]
[1] FALSE
[[3]]
[,1] [,2]
[1,] 1 2
[2,] 3 4
列表具有非常靈活的引用方法
- 按索引號
> a <- list()
> a
list()
> a[[1]] = "A"
> a
[[1]]
[1] "A"
> a[[2]]="B"
> a
[[1]]
[1] "A"
[[2]]
[1] "B"
- 按名稱
> a
list()
> a$fruit = "Apple"
> a
$fruit
[1] "Apple"
> a$color = "green"
> a
$fruit
[1] "Apple"
$color
[1] "green"
- 這也可以是遞迴的,並且可以組合使用
> a = list()
> a[[1]] = "house"
> a$park = "green's park"
> a
[[1]]
[1] "house"
$park
[1] "green's park"
> a$park = "green's park"
> a[[1]]$address = "1 main st."
> a
[[1]]
[[1]][[1]]
[1] "house"
[[1]]$address
[1] "1 main st."
$park
[1] "green's park"
使用 R 中的作用域規則,還可以動態命名和建立列表元素
> a <- list()
> n <- 1:10
> fruit = paste("number of coconuts in bin",n)
> my.number = paste("I have",10:1,"coconuts")
> for (i in 1:10)a[fruit[i]] = my.number[i]
> a$'number of coconuts in bin 7'
[1] "I have 4 coconuts"
資料框被稱為“相同長度的變數/向量的列表”。在以下示例中,建立了一個由兩個向量組成的資料框,每個向量有五個元素。第一個向量 v1 由 1 到 5 的整數序列組成。第二個向量 v2 由五種型別的 T 和 F 邏輯值組成。然後建立資料框,由這些向量組成。可以使用整數下標或列名稱和$符號訪問資料框的列。
> v1 <- 1:5
> v2 <- c(T,T,F,F,T)
> df <- data.frame(v1,v2)
> print(df)
v1 v2
1 1 TRUE
2 2 TRUE
3 3 FALSE
4 4 FALSE
5 5 TRUE
> df[,1]
[1] 1 2 3 4 5
> df$v2
[1] TRUE TRUE FALSE FALSE TRUE
可以直接建立資料框。在以下程式碼中,建立資料框 - 將組成資料框的每個向量命名為引數列表的一部分。
> df <- data.frame(foo=1:5,bar=c(T,T,F,F,T))
> print(df)
foo bar
1 1 TRUE
2 2 TRUE
3 3 FALSE
4 4 FALSE
5 5 TRUE
- R 中的資料框物件(“R in Action”書籍中的示例章節)
- 資料框物件的聚合和重構(“R in Action”書籍中的示例章節)
