初識R數據結構

對於沒有絲毫編程基礎的小白來講,剛接觸R語言確實困難不少,第一遍啃似看天書,很多術語及函數在腦海里根本沒概念。預習完第一、二章後開始聽猴子老師的課程,聽完後感覺開始有些思路,欣喜一番。然後開始安裝R和Rstudio,打開Rstudio,仍一臉懵逼,包括第二遍看書,仍然一萬個為什麼湧現出來,使用函數時括弧內的變數有時候用雙引號,有時候又不用,到底啥時候用啥時候不用?操作時誤操作雙引號變單引號,結果也可以啊!?什麼是csv文件?為什麼導入時總提示「incomplete final line found」?很多看起來很基本的知識都不知道,抓腮撓耳苦惱的不行。後來我開始嘗試按照書中的步驟進行操作,不知道的百度、Google,找視頻看,再看書本第三遍、第四遍,再進行操作,逐步漸漸的開始理解、熟悉,「書讀百遍,其意自現」的道理在這裡體現的淋漓盡致。

所以,總結下來今後的學習方式是:預習,記錄疑問;然後聽課,第二遍看書實踐,解除疑問,總結;最後再進行第三遍、或第四遍加深。

以下是自己的部分總結及實踐內容:

  • 第一章

我將一些覺得重要的內容及今後可能用到的函數黏貼下來,以方便後期查找使用。

1.輸入

函數source(「filename」)可在當前會話中執行一個腳本,腳本文件以.R作為擴展名,但非必需。

2.文本輸出

函數sink(「filename」)將輸出重定向到文件filename中,默認情況,若文件已存在,則它的內容將被覆蓋,參數append=TRUE可以將文本追加到文件後,而不是覆蓋它。參數split=TRUE可將輸出同時發送屏幕和輸出文件中。不加參數直接調用sink()將僅向屏幕返回輸出結果。

3.圖形輸出

函數sink()對圖形輸出沒有影響,若要定向輸出圖形,則使用以下函數,最後使用dev.off()將輸出返回終端。

函數source()進行輸入,函數sink()進行輸出,具體參數的應用可以根據需要進行使用。

4.包

計算機上存儲包的目錄稱為庫(library)

函數library()可以顯示庫中有哪些包

函數.libPaths()能夠顯示庫所在位置

命令search()可以查看哪些包已載入並可以使用

命令install.packages()將顯示一個CRAN鏡像站點的列表

命令install.packages(「packagesname」)用來下載和安裝包

命令update.packages()可以更新已安裝的包

命令installed.packages()可以查看已安裝的包,及其版本號等信息

命令library()可以在R中調入使用包

5.部分今後可能常用函數

  • 第二章

主要有兩塊內容,一是熟悉各種數據結構,二是了解導入數據的方法。

1.數據集及數據結構

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

R中用於存儲數據的結構包括向量、數組、數據框、列表和因子。數據框是用來存儲數據集的主要數據結構,因子(factor)是名義型變數或有序型變數,他們在R中被特殊的存儲和處理。

R可以處理的數據類型(模式)包括數值型、字元型、邏輯型(TRUE/FALSE)、複數型(虛數)和原生型(位元組)。

具體各種數據結構的使用及注意事項我用一個表格進行總結(貌似貼上去有些看不清晰):

各數據結構的實踐如下:

向量

> a<-c("h","j","k","m","l","n")

> a[2]

[1] "j"

> a[c(1,3,4)]

[1] "h" "k" "m"

> a[2:6]

[1] "j" "k" "m" "l" "n"

矩陣

> cells<-c(3,68,35,24,46,78)

> rnames<-c("R1","R2")

> cnames<-c("C1","C2","C3")

> mymatrix<-matrix(cells,nrow=2,ncol=3,byrow=FALSE,

+ dimnames=list(rnames,cnames))

> mymatrix

C1 C2 C3

R1 3 35 46

R2 68 24 78

> mymatrix[2,]

C1 C2 C3

68 24 78

> mymatrix[,1]

R1 R2

3 68

> mymatrix[1,2]

[1] 35

> mymatrix[2,c(1,2)]

C1 C2

68 24

數組

> dim1<-c("A1","A2")

> dim2<-c("B1","B2","B3")

> dim3<-c("C1","C2","C3","C4")

> y<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))

> y

, , C1

B1 B2 B3

A1 1 3 5

A2 2 4 6

, , C2

B1 B2 B3

A1 7 9 11

A2 8 10 12

, , C3

B1 B2 B3

A1 13 15 17

A2 14 16 18

, , C4

B1 B2 B3

A1 19 21 23

A2 20 22 24

> y[2,1,3]

[1] 14

數據框

> patientID<-c(1,2,3,4)

> age<-c(25,34,28,52)

> diabetes<-c("Type1","Type2","Type1","Type1")

> status<-c("Poor","Improved","Excellent","Poor")

> patientdata<-data.frame(patientID,age,diabetes,status)

> patientdata

patientID age diabetes status

1 1 25 Type1 Poor

2 2 34 Type2 Improved

3 3 28 Type1 Excellent

4 4 52 Type1 Poor

> patientdata$age

[1] 25 34 28 52

> patientdata[3:4]

diabetes status

1 Type1 Poor

2 Type2 Improved

3 Type1 Excellent

4 Type1 Poor

> patientdata[c("diabetes","status")]

diabetes status

1 Type1 Poor

2 Type2 Improved

3 Type1 Excellent

4 Type1 Poor

> with(patientdata,{z<<-summary(diabetes)})

> z

Type1 Type2

3 1

列表

> g<-"My First List"

> h<-c(25,26,18,36)

> j<-matrix(1:10,nrow=2)

> k<-c("one","two","three")

> mylist<-list(title=g,ages=h,j,k)

> mylist

$title

[1] "My First List"

$ages

[1] 25 26 18 36

[[3]]

[,1] [,2] [,3] [,4] [,5]

[1,] 1 3 5 7 9

[2,] 2 4 6 8 10

[[4]]

[1] "one" "two" "three"

> mylist[[2]]

[1] 25 26 18 36

> mylist["ages"]

$ages

[1] 25 26 18 36

> mylist$ages

[1] 25 26 18 36

> mylist[["ages"]]

[1] 25 26 18 36

2.數據輸入

1)鍵盤輸入

步驟:先建立一個空的數據框或矩陣,再調用函數edit(object)進行數據的編輯。這種方式在處理小數據集的時候很有效。

2)將帶分隔符的文本文件導入數據

用命令read.table()進行導入,此函數可讀入一個表格格式的文件並將其保存為一個數據框。

一般格式為read.table(file,options)

注意事項:

1.導入數據前,先確保導入文件在R默認工作目錄中,若不在默認工作目錄中,可用setwd()先行進行設定。

2.read.table可導入txt/csv文件,其中參數「file」需為「文件名.txt/csv」格式

3.read.csv和read.csv2可分別導入以逗號和分號分隔的文件,導入逗號分隔文本文件時用read.csv要比read.table好用

4.需將游標放在最後一行按回車鍵,用來表示文件結束。

5.函數read.table()的options選項如下:

3)excel文件導入

讀取excel文件的最好方式是將excel文件保存為逗號分隔文件(csv)進行導入。也可以用xlsx包直接地導入Excel工作表。當然xlsx包下載時可能會有些麻煩。

  • 實踐作業

> getwd()

[1] "C:/Users/1/Documents"

> setwd("C:/Users/1/Desktop")

> patientdata<-read.csv("病例數據.csv",header=TRUE,

+ sep=",",stringsAsFactors = FALSE)

> patientdata

病人編號 姓名 年齡 糖尿病類型 病情 病情.1

1 1 猴子 29 1型糖尿病 較差 Poor

2 2 李同 34 2型糖尿病 好轉 Improved

3 3 王五 28 1型糖尿病 顯著好轉 Excellent

4 4 張三 52 2型糖尿病 較差 Poor

> str(patientdata)

data.frame: 4 obs. of 6 variables:

$ 病人編號 : int 1 2 3 4

$ 姓名 : chr "猴子" "李同" "王五" "張三"

$ 年齡 : int 29 34 28 52

$ 糖尿病類型: chr "1型糖尿病" "2型糖尿病" "1型糖尿病" "2型糖尿病"

$ 病情 : chr "較差" "好轉" "顯著好轉" "較差"

$ 病情.1 : chr "Poor" "Improved" "Excellent" "Poor"

> nrow(patientdata)

[1] 4

> Type1<-patientdata[patientdata$糖尿病類型=="1型糖尿病",]

> Type1

病人編號 姓名 年齡 糖尿病類型 病情 病情.1

1 1 猴子 29 1型糖尿病 較差 Poor

3 3 王五 28 1型糖尿病 顯著好轉 Excellent

> nrow(Type1)

[1] 2

> 病人編號<-c(5)

> 姓名<-c("趙六")

> 年齡<-c(33)

> 糖尿病類型<-c("1型糖尿病")

> 病情<-c("較差")

> 病情.1<-c("Poor")

> newpatient<-data.frame(病人編號,姓名,年齡,糖尿病類型,病情,病情.1)

> newpatient

病人編號 姓名 年齡 糖尿病類型 病情 病情.1

1 5 趙六 33 1型糖尿病 較差 Poor

> patientdata<-rbind(patientdata,newpatient)

> patientdata

病人編號 姓名 年齡 糖尿病類型 病情 病情.1

1 1 猴子 29 1型糖尿病 較差 Poor

2 2 李同 34 2型糖尿病 好轉 Improved

3 3 王五 28 1型糖尿病 顯著好轉 Excellent

4 4 張三 52 2型糖尿病 較差 Poor

5 5 趙六 33 1型糖尿病 較差 Poor

> 入院時間<-c("2015-3-1","2014-12-31","2015-10-1",

+ "2015-5-1","2016-12-31")

> patientdata<-cbind(patientdata,入院時間)

> patientdata

病人編號 姓名 年齡 糖尿病類型 病情 病情.1 入院時間

1 1 猴子 29 1型糖尿病 較差 Poor 2015-3-1

2 2 李同 34 2型糖尿病 好轉 Improved 2014-12-31

3 3 王五 28 1型糖尿病 顯著好轉 Excellent 2015-10-1

4 4 張三 52 2型糖尿病 較差 Poor 2015-5-1

5 5 趙六 33 1型糖尿病 較差 Poor 2016-12-31

根據以上操作可知,在加入新的糖尿病病人前,共有4位患糖尿病病人,其中患「1型糖尿病」病人有2位。

儘管學習,剩下的,交給時間!^-^


推薦閱讀:

浙江大學-數據結構-拓撲序列-8.2.2
浙江大學-數據結構-選講Complete Binary Search Tree-7.3.2
浙江大學-數據結構-選講Huffman Codes-7.4.1
排序——希爾排序
九章演算法 | Google 面試題:多餘的連接

TAG:數據分析 | 大數據分析 | 數據結構 |