跳轉至內容

R 程式設計/資料型別

來自 Wikibooks,開放世界中的開放書籍


資料型別

[編輯 | 編輯原始碼]

向量(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
[編輯 | 編輯原始碼]



上一頁:示例會話 索引 下一頁:設定
華夏公益教科書