數據處理基礎—數據類型了解一下
- 2020 年 3 月 30 日
- 筆記


書籍翻譯
好的書籍是人類進步的階梯,但有些人卻找不到優秀的階梯,為此我們開設了書籍翻譯這個欄目,作為你學習之路的指路明燈;分享國內外優秀書籍,弘揚分享精神,做一個知識的傳播者。
希望大家能有所收穫!
書籍翻譯歷史目錄

正
文
R/Bioconductor簡介
5.3
數據類型/類
R是一種高級語言,因此底層數據類型通常並不重要。例外是如果您使用其他語言(如C)直接訪問R數據,但這超出了本課程的範圍。相反,我們將考慮基本數據類型:數字,整數,邏輯和字符,以及稱為「因子」的更高級數據類。您可以使用「class()」函數檢查數據的類。
除此之外:R還可以將數據存儲複雜數字為『complex』,但通常這與生物分析無關。
5.3.1
數字
「數字」類是存儲任何數字數據的默認類 – 整數,十進制數,科學計數法中的數字等…
x = 1.141 class(x)
## [1] "numeric"
y = 42 class(y)
## [1] "numeric"
z = 6.02e23 class(z)
## [1] "numeric"
在這裡我們看到,即使R有一個「整數」類,42也可以更有效地存儲為整數,但是R默認是將其存儲為「數字」類。如果我們想要42存儲為整數,我們必須「強制」它到該類:
y = as.integer(42) class(y)
## [1] "integer"
強制將強制R將數據存儲為特定類,如果我們的數據與該類不兼容,它仍將執行此操作,但數據將轉換為NA:
as.numeric("H")
## Warning: NAs introduced by coercion
## [1] NA
上面我們試圖將由雙引號標識的「字符」數據強制轉換為無意義的數字數據,因此我們觸發(「threw」)警告消息。由於這只是一個警告,R將繼續執行腳本或者函數中的任何後續命令,而「錯誤」將導致R停止。
5.3.2
字符/字符串
「character」類存儲各種文本數據。編寫程序時習慣將包含多個字母的數據稱為「字符串」,因此大多數作用於字符數據的R函數將數據稱為「字符串」,並且通常在其名稱中包含「str」或「string」。字符串通過雙引號標識,而變量或者函數的名稱則沒有:
x = 5 a = "x" # character "x" a
## [1] "x"
b = x # variable x b
## [1] 5
除了標準的字母數字字符外,字符串還可以存儲各種特殊字符。使用後面跟着的單個字符來識別特殊字符,最相關的是tab的特殊字符:t
和換行符:n
。為了演示這些特殊字符,可以將兩個字符串連接起來(cat),這些字符分隔(sep)它們:
cat("Hello", "World", sep= " ")
## Hello World
cat("Hello", "World", sep= "t")
## Hello World
cat("Hello", "World", sep= "n")
## Hello ## World
請注意,特殊字符在不同的函數中有不同的作用,例如,該paste
函數執行和cat
相同的操作,但不識別特殊字符。
paste("Hello", "World", sep= " ")
## [1] "Hello World"
paste("Hello", "World", sep= "t")
## [1] "HellotWorld"
paste("Hello", "World", sep= "n")
## [1] "HellonWorld"
單反斜杠或雙反斜杠也可用作escape
,功能是關閉特殊字符的功能或允許引號包含在字符串中:
cat("This "string" contains quotation marks.")
## This "string" contains quotation marks.
特殊字符通常僅用於模式匹配,以及將數據讀取或者寫入文件。例如,這是您用標籤分隔的文件讀入R的方式。
dat = read.delim("file.tsv", sep="t")
另一種特殊類型的字符數據是顏色。顏色可以通過三種主要方式指定:使用可用的名稱,使用rgb
函數獲得紅色,綠色,藍色值,或者通過使用hsv函數改變色調(顏色),飽和度(顏色與白色)和值(顏色/白色與黑色)。
默認情況下,rgb和hsv會在0-1中有三個值,透明度是可選的第四個值。或者,可以從許多不同的包中加載具有有用屬性的預定顏色組,其中RColorBrewer是最受歡迎的顏色之一。
reds = c("red", rgb(1,0,0), hsv(0, 1, 1)) reds
## [1] "red" "#FF0000" "#FF0000"
barplot(c(1,1,1), col=reds, names=c("by_name", "by_rgb", "by_hsv"))

5.3.3
邏輯
在logical
類存儲布爾真值,即TRUE和FALSE。它用於存儲邏輯運算的結果,條件語句將被強制轉換為此類。大多數其他數據類型也可以強制轉換為布爾值而不會觸發(或「throw」)錯誤消息,這可能會導致意外的事情發生。
x = TRUE class(x)
## [1] "logical"
y = "T" as.logical(y)
## [1] TRUE
z = 5 as.logical(z)
## [1] TRUE
x = FALSE class(x)
## [1] "logical"
y = "F" as.logical(y)
## [1] FALSE
z = 0 as.logical(z)
## [1] FALSE
練習1使用其他字符和數值進行實驗,這些值被強制轉化為為TRUE或FALSE?你有沒有收到警告/錯誤信息?
5.3.4
因子
字符串/字符數據存儲效率非常低,每個字母通常需要與整數相同的內存量。因此,當存儲具有重複元素的字符串向量時,更有效地辦法是將每個元素分配給整數並將向量存儲為整數和附加的字符串與整數關聯的表格中。因此,默認情況下,R將讀取數據表的文本列作為因子。
str_vector = c("Apple", "Apple", "Banana", "Banana", "Banana", "Carrot", "Carrot", "Apple", "Banana") factored_vector = factor(str_vector) factored_vector
## [1] Apple Apple Banana Banana Banana Carrot Carrot Apple Banana ## Levels: Apple Banana Carrot
as.numeric(factored_vector)
## [1] 1 1 2 2 2 3 3 1 2
因子的雙重性質可能導致一些不直觀的行為。例如,將兩個因子結合在一起會將它們轉換為數字形式,原始的字符串將丟失。
c(factored_vector, factored_vector)
## [1] 1 1 2 2 2 3 3 1 2 1 1 2 2 2 3 3 1 2
同樣,如果由於格式問題,數字數據被錯誤地解釋為字符串,那麼在強制轉換為數值之前必須將因子轉換回字符串:
x = c("20", "25", "23", "38", "20", "40", "25", "30") x = factor(x) as.numeric(x)
## [1] 1 3 2 5 1 6 3 4
as.numeric(as.character(x))
## [1] 20 25 23 38 20 40 25 30
要使R讀取文本作為字符數據而不是因子,需要設置環境選項stringsAsFactors=FALSE
。這必須在每個R會話剛開始時完成。
options(stringsAsFactors=FALSE)
練習如何使用因子為上面的任意長的矢量,比如str_vector
,創建顏色矢量?
5.3.5
檢查類/類型
我們建議您在讀取文件後檢查數據類型是否正確:
x = 1.4 is.numeric(x)
## [1] TRUE
is.character(x)
## [1] FALSE
is.logical(x)
## [1] FALSE
is.factor(x)
## [1] FALSE
5.4
基本數據結構
到目前為止,我們只關注單個值和向量。向量是R中最簡單的數據結構。它們是所有相同類型的一維數據數組。如果創建向量時的輸入具有不同類型,則它將被強制轉換為與數據最一致的數據類型。
x = c("Hello", 5, TRUE) x
## [1] "Hello" "5" "TRUE"
class(x)
## [1] "character"
在這裡,我們嘗試將字符,數字和邏輯數據放入單個向量中,以便將所有值強制轉換為character數據。
matrix
是向量的二維版本,它也要求所有數據具有相同的類型。如果我們將字符向量和數字向量組合成矩陣,則所有數據都將被強制轉換為字符:
x = c("A", "B", "C") y = c(1, 2, 3) class(x)
## [1] "character"
class(y)
## [1] "numeric"
m = cbind(x, y) m
## x y ## [1,] "A" "1" ## [2,] "B" "2" ## [3,] "C" "3"
引號表示數字向量已被強制轉換為字符。或者,要使用不同數據類型的列存儲數據,我們可以也使用數據框。
z = data.frame(x, y) z
## x y ## 1 A 1 ## 2 B 2 ## 3 C 3
class(z[,1])
## [1] "character"
class(z[,2])
## [1] "numeric"
如果你已經設置了stringsAsFactors = FALSE,你會發現第一列仍然是字符,否則它將自動轉換為一個因子。
options(stringsAsFactors=TRUE) z = data.frame(x, y) class(z[,1])
## [1] "factor"
矩陣和數據框之間的另一個區別是使用$
運算符選擇列的能力:
m$x # error z$x # ok
最基本數據結構是list
。列表允許將不同類型和不同長度的數據存儲在單個對象中。列表的每個元素可以是任何其他R對象:任何類型的數據,任何數據結構,甚至其他列表或函數。
l = list(m, z) ll = list(sublist=l, a_matrix=m, numeric_value=42, this_string="Hello World", even_a_function=cbind) ll
## $sublist ## $sublist[[1]] ## x y ## [1,] "A" "1" ## [2,] "B" "2" ## [3,] "C" "3" ## ## $sublist[[2]] ## x y ## 1 A 1 ## 2 B 2 ## 3 C 3 ## ## ## $a_matrix ## x y ## [1,] "A" "1" ## [2,] "B" "2" ## [3,] "C" "3" ## ## $numeric_value ## [1] 42 ## ## $this_string ## [1] "Hello World" ## ## $even_a_function ## function (..., deparse.level = 1) ## .Internal(cbind(deparse.level, ...)) ## <bytecode: 0x55aa107d6378> ## <environment: namespace:base>
當從不適合任何先前數據結構的函數返回大量結果時,列表最常用。
5.5
更多信息
通過鍵入?function
交互式會話,您可以獲得有關與這些數據類型相關的任何R命令的更多信息

