天天看點

R 資料類型

資料類型指的是用于聲明不同類型的變量或函數的一個廣泛的系統。

變量的類型決定了變量存儲占用的空間,以及如何解釋存儲的位模式。

R 語言中的最基本資料類型主要有三種:

數字

邏輯

文本

數字常量主要有兩種:

一般型

123 -0.125

科學計數法

1.23e2 -1.25E-1

邏輯類型在許多其他程式設計語言中常稱為布爾型(Boolean),常量值隻有 TRUE 和 FALSE。

注意:R 語言區分大小寫,true 或 True 不能代表 TRUE。

最直覺的資料類型就是文本類型。文本就是其它語言中常出現的字元串(String),常量用雙引号包含。在 R 語言中,文本常量既可以用單引号包含,也可以用雙引号包含,例如:

> 'runoob' == "runoob"

[1] TRUE

有關于 R 語言的變量定義,并不像一些強類型語言中的文法規則,需要專門為變量設定名稱和資料類型,每當在 R 中使用指派運算符時,實際上就是定義了一個新的變量:

a = 1

b <- TRUE

b = "abc"

按對象類型來分是以下 6 種(後面會詳細介紹這幾種類型):

向量(vector)

清單(list)

矩陣(matrix)

數組(array)

因子(factor)

資料框(data.frame)

R 資料類型

向量(Vector)在 Java、Rust、C# 這些專門程式設計的的語言的标準庫裡往往會提供,這是因為向量在數學運算中是不可或缺的工具——我們最常見的向量是二維向量,這種向量在平面坐标系中必然會用到。

向量從資料結構上看就是一個線性表,可以看成一個數組。

R 語言中向量作為一種類型存在可以讓向量的操作變得更加容易:

> a = c(3, 4)

> b = c(5, 0)

> a + b

[1] 8 4

>

c() 是一個創造向量的函數。

這裡把兩個二維向量相加,得到一個新的二維向量 (8, 4)。如果将一個二維向量和三維向量做運算,将失去數學意義,雖然不會停止運作,但會被警告。

我建議大家從習慣上杜絕這種情況的出現。

向量中的每一個元素可以通過下标單獨取出:

> a = c(10, 20, 30, 40, 50)

> a[2]

[1] 20

注意:R 語言中的"下标"不代表偏移量,而代表第幾個,也就是說是從 1 開始的!

R 也可以友善的取出向量的一部分:

> a[1:4] # 取出第 1 到 4 項,包含第 1 和第 4 項

[1] 10 20 30 40

> a[c(1, 3, 5)] # 取出第 1, 3, 5 項

[1] 10 30 50

> a[c(-1, -5)] # 去掉第 1 和第 5 項

[1] 20 30 40

這三種部分取出方法是最常用的。

向量支援标量計算:

> c(1.1, 1.2, 1.3) - 0.5

[1] 0.6 0.7 0.8

> a = c(1,2)

> a ^ 2

[1] 1 4

之前講述的常用的數學運算函數,如 sqrt 、exp 等,同樣可以用于對向量作标量運算。

"向量"作為線性表結構,應該具備一些常用的線性表處理函數,R 确實具備這些函數:

向量排序:

> a = c(1, 3, 5, 2, 4, 6)

> sort(a)

[1] 1 2 3 4 5 6

> rev(a)

[1] 6 4 2 5 3 1

> order(a)

[1] 1 4 2 5 3 6

> a[order(a)]

order() 函數傳回的是一個向量排序之後的下标向量。

向量統計

R 中有十分完整的統計學函數:

函數名

含義

sum

求和

mean

求平均值

var

方差

sd

标準差

min

最小值

max

最大值

range

取值範圍(二維向量,最大值和最小值)

向量統計執行個體:

> sum(1:5)

[1] 15

> sd(1:5)

[1] 1.581139

> range(1:5)

[1] 1 5

向量生成

向量的生成可以用 c() 函數生成,也可以用 min:max 運算符生成連續的序列。

如果想生成有間隙的等差數列,可以用 seq 函數:

seq 還可以生成從 m 到 n 的等差數列,隻需要指定 m, n 以及數列的長度:

rep 是 repeat(重複)的意思,可以用于産生重複出現的數字序列:

向量中常會用到 NA 和 NULL ,這裡介紹一下這兩個詞語與差別:

NA 代表的是"缺失",NULL 代表的是"不存在"。

NA 缺失就像占位符,代表這裡沒有一個值,但位置存在。

NULL 代表的就是資料不存在。

執行個體說明:

> length(c(NA, NA, NULL))

[1] 2

> c(NA, NA, NULL, NA)

[1] NA NA NA

很顯然, NULL 在向量中沒有任何意義。

邏輯向量主要用于向量的邏輯運算,例如:

> c(1, 2, 3) > 2

[1] FALSE FALSE  TRUE

which 函數是十分常見的邏輯型向量處理函數,可以用于篩選我們需要的資料的下标:

> a = c(1, 2, 3)

> b = a > 2

> print(b)

> which(b)

[1] 3

例如我們需要從一個線性表中篩選大于等于 60 且小于 70 的資料:

> vector = c(10, 40, 78, 64, 53, 62, 69, 70)

> print(vector[which(vector >= 60 & vector < 70)])

[1] 64 62 69

類似的函數還有 all 和 any:

> all(c(TRUE, TRUE, TRUE))

> all(c(TRUE, TRUE, FALSE))

[1] FALSE

> any(c(TRUE, FALSE, FALSE))

> any(c(FALSE, FALSE, FALSE))

all() 用于檢查邏輯向量是否全部為 TRUE,any() 用于檢查邏輯向量是否含有 TRUE。

字元串資料類型本身并不複雜,這裡注重介紹字元串的操作函數:

> toupper("Runoob") # 轉換為大寫

[1] "RUNOOB"

> tolower("Runoob") # 轉換為小寫

[1] "runoob"

> nchar("中文", type="bytes") # 統計位元組長度

[1] 4

> nchar("中文", type="char") # 總計字元數量

> substr("123456789", 1, 5) # 截取字元串,從 1 到 5

[1] "12345"

> substring("1234567890", 5) # 截取字元串,從 5 到結束

[1] "567890"

> as.numeric("12") # 将字元串轉換為數字

[1] 12

> as.character(12.34) # 将數字轉換為字元串

[1] "12.34"

> strsplit("2019;10;1", ";") # 分隔符拆分字元串

[[1]]

[1] "2019" "10"   "1"

> gsub("/", "-", "2019/10/1") # 替換字元串

[1] "2019-10-1"

在 Windows 計算機上實作,使用的是 GBK 編碼标準,是以一個中文字元是兩個位元組,如果在 UTF-8 編碼的計算機上運作,單個中文字元的位元組長度應該是 3。

R 支援 perl 語言格式的正規表達式:

> gsub("[[:alpha:]]+", "$", "Two words")

[1] "$ $"

更多字元串内容參考:R 語言字元串介紹。

R 語言為線性代數的研究提供了矩陣類型,這種資料結構很類似于其它語言中的二維數組,但 R 提供了語言級的矩陣運算支援。

首先看看矩陣的生成:

> vector=c(1, 2, 3, 4, 5, 6)

> matrix(vector, 2, 3)

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6

矩陣初始化内容是由一個向量來傳遞的,其次要表達一個矩陣有幾行、有幾列。

向量中的值會一列一列的填充到矩陣中。如果想按行填充,需要指定 byrow 屬性:

> matrix(vector, 2, 3, byrow=TRUE)

[1,]    1    2    3

[2,]    4    5    6

矩陣中的每一個值都可以被直接通路:

> m1 = matrix(vector, 2, 3, byrow=TRUE)

> m1[1,1] # 第 1 行 第 1 列

[1] 1

> m1[1,3] # 第 1 行 第 3 列

R 中的矩陣的每一個列和每一行都可以設定名稱,這個過程通過字元串向量批量完成:

> colnames(m1) = c("x", "y", "z")

> rownames(m1) = c("a", "b")

> m1

  x y z

a 1 2 3

b 4 5 6

> m1["a", ]

x y z

1 2 3

矩陣的四則運算與向量基本一緻,既可以與标量做運算,也可以與同規模的矩陣做對應位置的運算。

矩陣乘法運算:

R 資料類型

> m1 = matrix(c(1, 2), 1, 2)

> m2 = matrix(c(3, 4), 2, 1)

> m1 %*% m2

     [,1]

[1,]   11

逆矩陣:

R 資料類型

> A = matrix(c(1, 3, 2, 4), 2, 2)

> solve(A)

     [,1] [,2]

[1,] -2.0  1.0

[2,]  1.5 -0.5

apply() 函數可以将矩陣的每一行或每一列當作向量來進行操作:

> (A = matrix(c(1, 3, 2, 4), 2, 2))

[1,]    1    2

[2,]    3    4

> apply(A, 1, sum) # 第二個參數為 1 按行操作,用 sum() 函數

[1] 3 7

> apply(A, 2, sum) # 第二個參數為 2 按列操作

[1] 4 6

更多矩陣内容參考:R 矩陣。

上一篇: R 基礎運算
下一篇: R 判斷語句