初識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 面試題:多餘的連接