數據類型指的是用于聲明不同類型的變量或函數的一個廣泛的系統(tǒng)。
變量的類型決定了變量存儲占用的空間,以及如何解釋存儲的位模式。
R 語言中的最基本數據類型主要有三種:
數字
邏輯
文本
數字常量主要有兩種:
一般型 | 123 -0.125 |
---|---|
科學計數法 | 1.23e2 -1.25E-1 |
邏輯類型在許多其他編程語言中常稱為布爾型(Boolean),常量值只有 TRUE 和 FALSE。
注意:R 語言區(qū)分大小寫,true 或 True 不能代表 TRUE。
最直觀的數據類型就是文本類型。文本就是其它語言中常出現(xiàn)的字符串(String),常量用雙引號包含。在 R 語言中,文本常量既可以用單引號包含,也可以用雙引號包含,例如:
> 'nhooo' == "nhooo" [1] TRUE
有關于 R 語言的變量定義,并不像一些強類型語言中的語法規(guī)則,需要專門為變量設置名稱和數據類型,每當在 R 中使用賦值運算符時,實際上就是定義了一個新的變量:
a = 1 b <- TRUE b = "abc"
按對象類型來分是以下 6 種(后面會詳細介紹這幾種類型):
向量(Vector)在 Java、Rust、C# 這些專門編程的的語言的標準庫里往往會提供,這是因為向量在數學運算中是不可或缺的工具——我們最常見的向量是二維向量,這種向量在平面坐標系中必然會用到。
向量從數據結構上看就是一個線性表,可以看成一個數組。
R 語言中向量作為一種類型存在可以讓向量的操作變得更加容易:
> a = c(3, 4) > b = c(5, 0) > a + b [1] 8 4 >
c() 是一個創(chuàng)造向量的函數。
這里把兩個二維向量相加,得到一個新的二維向量 (8, 4)。如果將一個二維向量和三維向量做運算,將失去數學意義,雖然不會停止運行,但會被警告。
我建議大家從習慣上杜絕這種情況的出現(xiàn)。
向量中的每一個元素可以通過下標單獨取出:
> 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)] [1] 1 2 3 4 5 6
order() 函數返回的是一個向量排序之后的下標向量。
向量統(tǒng)計
R 中有十分完整的統(tǒng)計學函數:
函數名 | 含義 |
---|---|
sum | 求和 |
mean | 求平均值 |
var | 方差 |
sd | 標準差 |
min | 最小值 |
max | 最大值 |
range | 取值范圍(二維向量,最大值和最小值) |
向量統(tǒng)計示例:
> sum(1:5) [1] 15 > sd(1:5) [1] 1.581139 > range(1:5) [1] 1 5
向量生成
向量的生成可以用 c() 函數生成,也可以用 min:max 運算符生成連續(xù)的序列。
如果想生成有間隙的等差數列,可以用 seq 函數:
> seq(1, 9, 2) [1] 1 3 5 7 9
seq 還可以生成從 m 到 n 的等差數列,只需要指定 m, n 以及數列的長度:
> seq(0, 1, length.out=3) [1] 0.0 0.5 1.0
rep 是 repeat(重復)的意思,可以用于產生重復出現(xiàn)的數字序列:
> rep(0, 5) [1] 0 0 0 0 0
向量中常會用到 NA 和 NULL ,這里介紹一下這兩個詞語與區(qū)別:
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) [1] FALSE FALSE TRUE > 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)) [1] TRUE > all(c(TRUE, TRUE, FALSE)) [1] FALSE > any(c(TRUE, FALSE, FALSE)) [1] TRUE > any(c(FALSE, FALSE, FALSE)) [1] FALSE
all() 用于檢查邏輯向量是否全部為 TRUE,any() 用于檢查邏輯向量是否含有 TRUE。
字符串數據類型本身并不復雜,這里注重介紹字符串的操作函數:
> toupper("Nhooo") # 轉換為大寫 [1] "nhooo" > tolower("Nhooo") # 轉換為小寫 [1] "nhooo" > nchar("中文", type="bytes") # 統(tǒng)計字節(jié)長度 [1] 4 > nchar("中文", type="char") # 總計字符數量 [1] 2 > 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 計算機上實現(xiàn),使用的是 GBK 編碼標準,所以一個中文字符是兩個字節(jié),如果在 UTF-8 編碼的計算機上運行,單個中文字符的字節(jié)長度應該是 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] [,2] [,3] [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 列 [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
矩陣的四則運算與向量基本一致,既可以與標量做運算,也可以與同規(guī)模的矩陣做對應位置的運算。
矩陣乘法運算:
> m1 = matrix(c(1, 2), 1, 2) > m2 = matrix(c(3, 4), 2, 1) > m1 %*% m2 [,1] [1,] 11
逆矩陣:
> 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] [,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 矩陣。