數據處理基礎—數據類型了解一下

  • 2020 年 3 月 30 日
  • 筆記

書籍翻譯

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

希望大家能有所收穫!

書籍翻譯歷史目錄

引言—關於課程

scRNA-seq簡介

scRNA-seq原始數據的質控

scRNA-seq數據處理—文件格式小結

scRNA-seq數據處理—demultiplexing

scRNA-seq數據的處理—STAR

scRNA-seq數據處理—Kallisto

scRNA-seq表達矩陣的構建

數據處理必備—R安裝

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命令的更多資訊

首個阿爾茨海默症單細胞轉錄組分析

GEO資料庫的這個功能你知道嗎

單細胞轉錄組影片在B站更新到第二單元啦!

單細胞實戰(三) Cell Ranger使用初探

你值得擁有的單細胞RNA測序分析工具TOP 3

單細胞實戰(二) cell ranger使用前注意事項

單細胞轉錄組聚類後的細胞類群如何查找資料庫來定義

單細胞實戰(一)數據下載

愛恨難分—癌症免疫治療獲得性抗性