1. 程式人生 > >R中數據結構

R中數據結構

方括號 維度 最大 優先權 回來 生效 組合 示例 取數

進行任何數據分析的第一步:創建包含研究信息的數據集。

在R中這個步驟包括以下兩步:

1. 選擇一種數據結構來存儲數據;

2. 將數據輸入或導入到這個數據結構中。

一、 數據集

數據集通常是由數據構成的一個矩形數組,行表示觀測,列表示變量

下圖是一個假想的病例數據集:

技術分享

R中的數據結構包括:標量、向量、矩陣、數組、數據框和列表。

上圖實際為R中的一個數據框。

R可以處理的數據類型包括:數值類型、字符型、邏輯性(TRUE/FALSE)、復數型(虛數)和原生型(字節)。

上圖中 前三列為數值型變量。後兩列為字符型變量。

R將實例標識符成為rownames(行名),將類別型(包括名義型和有序型)變量成為因子(factors)。

另外上圖中,你需要分別告訴R:PatientID是行/實例標識符;AdmDate是日期型變量;Age是連續型變量;Diabetes是名義型變量;Status是有序型變量。

二、 數據結構

R中的數據結構的示意圖如下,他們在存儲數據的類型、創建方式、結構復雜的,以及用於定位和訪問其中個別元素的標記等方面有不同。

技術分享

聲明一些定義:

對象:指可以賦值給變量的任何事物,包括常量、數據結構、函數甚至圖形。

模式:對象都擁有某種模式,描述了此對象是如何存儲的。

類:對象擁有某個類,像Print這樣的泛型函數表明如何處理此對象。

R Studio註釋/取消註釋的快捷鍵是: Ctrl + Shift + C.

運行程序快捷鍵:Command + 回車 (mac)

1. 向量

定義:向量用於存儲數值型、字符型或邏輯型數據的一維數組

創建方式:用函數c()來創建。

eg: a <- (1, 2, 3, -5, 6)  數值型向量

  b <- ("one", "two", "three")  字符型向量

  c <- (TRUE, TRUE, FALSE, TRUE, FALSE)  邏輯型向量

標量是只含一個元素的向量。 eg: f <- 3、 g <- "US"、 h <- TRUE,他們用於保存常亮。

訪問元素:通過在方括號中給定元素所處位置的數值。

eg: a[c(2, 4)] 表示訪問向量a中的第二個和第四個元素。

  a[2:6] 表示訪問a中第二個到第六個元素。

相當於用冒號生成一個數值序列。例如 a <- c(2:6) 等加入 a <- c(2, 3, 4, 5, 6)。 2:6表示數字2-6.

技術分享

2. 矩陣

定義:矩陣是一個二維數組,只是每個元素都擁有相同的模式(數值型、字符型或邏輯型)。即僅能包含一種數據類型。

   當維度超過2時,不妨使用數組;當有多種模式的數據時,可以使用數據框。

創建方式:用函數matrix()來創建。

一般使用格式:(可對照下圖實例進行理解)

myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_column,

          byrow=logical_value, dimnames=list(

          char_vector_rownames, char_vector_colnames))

其中vector包含了矩陣的元素,nrow和ncol指行和列的維數,

dimnames包含了可選的、以字符型向量表示的行名和列名。

選項byrow則表明矩陣應當按行填充(byrow=TRUE)還是按列填充(byrow=FALSE),默認按列填充。

eg:

技術分享

技術分享

訪問元素:可以使用下標和方括號來選擇矩陣中的行、列或元素。

X[i, ]指矩陣X中的第i行; X[, j]指第j列; X[i, j]指第i行第j個元素。

選擇多行或多列時,下標i和j可為數值型向量。

技術分享技術分享

3. 數組

數組和矩陣類似,但維度可以大於2.

創建形式:myarray <- array(vector, dimensions, dimnames)

vector包含了數組中的數據,dimensions是一個數值型向量,給出了各個維度下標的最大值,dimnames是可選的、各維度名稱標簽的列表。

數組中的數據也只能擁有一種模式。

從數組中選取元素的方式和矩陣相同: eg. myarray[1,2,3]

下邊代碼創建了一個三維(2x3x4)數值型數組的示例。直接貼代碼和結果吧。結合一起看,會特別直觀了。

技術分享

4. 數據框

定義:不同的列可以包含不同模式(數值型、字符型等)的數據。是最常用的一種數據結構。

創建方式:mydata <- data.frame(col1, col2, col3, ...) 每一列的名稱可由函數names指定。

每一列數據的模式必須唯一。

技術分享

選取數據框中元素的方式,可以用下標,也可指定列名

技術分享

選取數據框中的某個特定變量,用符號 $,eg. 數據框名字$列名

技術分享

想生成糖尿病類型變量disbetes和病情變量status的列聯表用如下代碼:

技術分享

我們可以對照上邊patientdata數據框數據,來理解這個聯表的意思。其實就是對diabetes和status兩列做了個統計。還是挺方便的。

但是每次都需要輸入數據框名字和$符號可能會比較麻煩,我們可以使用函數attach()和detach()或者單獨使用with()來簡化代碼。

函數attach()可將數據框添加到R的搜索路徑中。R在遇到一個變量名以後,將檢查搜索路徑中的數據框。

函數detach()將數據框從搜索路徑中移除。detach()並不會對數據框本身做任何處理。

技術分享

但當名稱相同的對象不止一個時,這個方法就會出現異常了。

譬如,在數據框patientdata被綁定(attach)之前,我們的環境中已經有了一個名為age的對象,這種情況下,原始對象將取得優先權。所有attach()和detach()最好在我們分析一個單獨的數據框並且不太可能有多個同名對象時使用。一定要註意那麽被屏蔽(masked)的警告。

技術分享

除此之外,另一種方式是使用函數with()。花括號{}之間的語句都是針對patientdata執行,這樣就無需擔心重名了。如果僅有一條語句,花括號可以省略

技術分享

但是函數with()的局限在於,賦值僅在此函數的括號內生效。

如果想外部也可以訪問,使用特殊賦值符 <<- 代替 標準賦值符 <-,他可將對象保存到with()之外的全局變量中。

技術分享

5. 因子

先說一下變量的分類:名義型變量、有序型變量和連續型變量。

名義型變量是沒有順序的類別變量。eg 糖尿病類型 Diabetes(Tpe1, Type2)。即便Type1 Type2分別編碼為1和2,這也並不意味著是有序的。

有序型變量表示一種順序關系。而非數量關系。eg 病情 Status(poor、improved、excellent)

連續型變量可以表示為某個範圍內的任意值,並同時表示順序和數量。eg 年齡Age

說回來:名義型變量(類別)和有序型變量在R中成為因子(factor)。

函數factor()以一個整數向量的形式存儲類別值,整數的取值範圍是[1 ... k](k是名義型變量中唯一值的個數),同時一個由字符串(原始值)組成的內部向量將映射到這些整數上。

下邊 factor(diabetes)將向量存儲為(1, 2 , 1 , 1),並在內部關聯為1=Type1和2=Type2。

技術分享

要表示有序型變量,需要為函數factor()指定參數ordered=TRUE.

因子的排序是依照字母順序創建的。但這樣往往不能符合我們心意。比如下邊,Poor應該是排在最末位的。

技術分享

我們可以通過指定levels選項來覆蓋默認排序:

技術分享

如果指定的水平和數據中的真實值不匹配,那麽在數據中出現而未在參數中列出的數據都將被設為缺失值。

技術分享

數值型變量可以用levels和labels參數來編碼成因子。

把變量轉換成一個無序因子。標簽的順序必須和水平相一致。在下邊例子中,性別被當成類別型變量。用字符串代替數字在結果中的輸出,而且所有不是1或者2的性別的變量都將被設置為缺失值。

技術分享

其實關於因子寫了這麽多,我頂多懂了百分之五十。下邊貼個大例子。

技術分享

首先以向量的形式輸入數據,然後將diabetes和status指定為普通因子和一個有序型因子。最後將數據合並為一個數據框。

函數str(object)可提供R中某個對象的信息。他清楚的顯示diabetes是一個因子,而status是一個有序因子。

summary()會區別對待各個變量。他顯示了連續型變量age的最小值、最大值、均值和各四分位數,並顯示了類別型變量diabetes和status(各水平)的頻數值。

:(終於寫完這個因子了。抄書一樣的覺得哪句話都有用。大部分還是沒懂。

6. 列表

列表list是R的數據類型中最為復雜的一種。列表就是一些對象的有序集合。其中對象可以包括若幹向量、、矩陣、數據框甚至其他列表組合。

可以使用函數list()創建列表:

mylist <- list(object1, object2, ...)

你還可以為列表中的對象命名:

mylist <- list(name1=object1, name2=object2, ...)

技術分享

原來list是以逗號分隔為一個元素的。 title=g, ages=h, 只是命名了某一個對象。

訪問列表中的元素的三種寫法:

技術分享

R的下標從1開始!!

這一小節終於看完了。

R中數據結構