編寫R語言的樂趣 --第二關:數據結構入門
小結
首先,總結一下三天時間的學習內容:1.《R語言實戰》的第一章:R語言介紹和第二章:創建數據集。2.猴子的知乎live:數據結構入門。3.群友的實踐筆記。
答案往往在後面
在獲得第二關邀請卡之前,預習了《R語言實戰》第一和第二章內容,這個過程當中我時刻提醒自己一定要「隻字不差」的看,哪怕不懂不理解的內容也要硬著頭皮看一遍。同時呢,我也時刻關注自己的心態,出現「急於求成」的心態時,提醒自己不要著急。以往,當遇到不明白的地方,不會的地方,我的第一反應是百度,然而有些答案並不能立刻解決問題,這時候我的心態就會變得焦急,煩躁,猶如煎熬。這種想要搞明白卻得不到答案心裡異常焦急的狀態是非常可怕的。
「很多問題雖然不能立即獲得答案,但是只要耐心地往前進,很可能答案就在不遠處」,這是我看完《R語言實戰》第一和第二章內容之後的感悟。
舉個例子,在「第一章1.3.3工作空間」處,作者首先拋出了getwd()和setwd()兩個函數,分別是顯示當前工作目錄和修改當前工作目錄。當我試著去運行setwd()的時候,系統提示「無法更改當前目錄」,問題出在哪兒呢?在這一小節快介紹的時候,作者才提醒:setwd()不會自動創建一個不存在的目錄,需要使用dir.create()函數來創建新目錄,然後再使用setwd()將工作目錄指向新的目錄……這裡吐槽一下作者的寫作邏輯。
另外我還想明白了,第一章是對R語言的一個概括性介紹,很多內容不明白沒有關係,繼續前進就行啦。
數據結構
數據集的概念就好比一間房子,數據結構的概念就是建造這間房子的材料的統稱,這些材料包括:向量,矩陣,數組,數據框,因子,列表。想像一下有些房子是純粹用竹子這種材料搭建起來的,有些房子是用石料和木料搭建的,而有些房子使用更多種類的材料。
一個簡單的3行4列的Excel數據表格就可以稱之為數一個數據集,行和列在各種領域有不同叫法,《R語言實戰》中稱之為觀測和變數。
變數包含:日期型變數,如10/15/2009;連續型變數,如年齡:22,23,26,44;名義型變數,如糖尿病的類型:1型,2型;有序型變數,如差,良,優。
變數的數據類型又分為:數值型(22,23,26,44),字元型(差,良,優),邏輯性(TRUE,FALSE),此外還有複數形和原生型。
創建向量:c()
> a <- c("a","b","c","d","e","f","g","h")n
向量是一維數組,用來儲存以上三種常規的數據類型(數值,字元,邏輯)。字元型數據需要加雙引號「」。注意:單個向量中的數據類型必須保持一致!
訪問向量中的元素
> a <- c("a","b","c","d","e","f","g","h")n> a[3]n[1] "c"n> a[c(1,3,5)]n[1] "a" "c" "e"n> a[2:5]n[1] "b" "c" "d" "e"n
創建矩陣:matrix()
> m <- matrix(1:30,nrow = 5,ncol = 6)n> mn [,1] [,2] [,3] [,4] [,5] [,6]n[1,] 1 6 11 16 21 26n[2,] 2 7 12 17 22 27n[3,] 3 8 13 18 23 28n[4,] 4 9 14 19 24 29n[5,] 5 10 15 20 25 30n
增加行和列的名稱
> rnames <- c("r1","r2","r3","r4","r5")n> cnames <- c("c1","c2","c3","c4","c5","c6")n> m <- matrix(1:30,nrow = 5,ncol = 6,dimnames = list(rnames,cnames))n> mn c1 c2 c3 c4 c5 c6nr1 1 6 11 16 21 26nr2 2 7 12 17 22 27nr3 3 8 13 18 23 28nr4 4 9 14 19 24 29nr5 5 10 15 20 25 30n
注意:一個矩陣中的元素數據類型必須保持一致!
按行填充
> m <- matrix(1:30,nrow = 5,ncol = 6,byrow = TRUE,dimnames = list(rnames,cnames))n> mn c1 c2 c3 c4 c5 c6nr1 1 2 3 4 5 6nr2 7 8 9 10 11 12nr3 13 14 15 16 17 18nr4 19 20 21 22 23 24nr5 25 26 27 28 29 30n
訪問矩陣中的元素
#訪問第一行元素n> m[1,]nc1 c2 c3 c4 c5 c6 n 1 2 3 4 5 6n
#訪問第二列元素n> m[,2]nr1 r2 r3 r4 r5 n 2 8 14 20 26 n
#訪問第3行的第6列元素n> m[3,6]n[1] 18n
#訪問第5行的第1和第3個元素n> m[5,c(1,3)]nc1 c3 n25 27 n
創建數組:array()
> dim1 <- c("第一行","第二行")n> dim2 <- c("第一列","第二列","第三列")n> dim3 <- c("第一組","第二組","第三組","第四組")n> a <- array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))n> an, , 第一組nn 第一列 第二列 第三列n第一行 1 3 5n第二行 2 4 6nn, , 第二組nn 第一列 第二列 第三列n第一行 7 9 11n第二行 8 10 12nn, , 第三組nn 第一列 第二列 第三列n第一行 13 15 17n第二行 14 16 18nn, , 第四組nn 第一列 第二列 第三列n第一行 19 21 23nn第二行 20 22 24n
創建數據框:data.frame()
與矩陣不同,數據框可以存儲2種或2種以上數據類型,每一列類型需一致。
> patientID <- c(1,2,3,4)n> name <- c(悟空,八戒,沙僧,唐僧)n> age <- c(30,28,35,40)n> diabetes <- c(1型糖尿病,2型糖尿病,1型糖尿病,2型糖尿病)n> status <- c(較差,好轉,顯著好轉,較差)n> patientdata <- data.frame(patientID,name,age,diabetes,status,stringsAsFactors = FALSE)n> patientdatan patientID name age diabetes statusn1 1 悟空 30 1型糖尿病 較差n2 2 八戒 28 2型糖尿病 好轉n3 3 沙僧 35 1型糖尿病 顯著好轉n4 4 唐僧 40 2型糖尿病 較差n
選取某一列: $和[ ]的區別
> age1 <- patientdata$agen> age1n[1] 30 28 35 40n
> age2 <- patientdata[age]n> age2n agen1 30n2 28n3 35n4 40n
選取2列或以上:[ ]
> subdata <- patientdata[c(name,age,status)]n> subdatan name age statusn1 悟空 30 較差n2 八戒 28 好轉n3 沙僧 35 顯著好轉n4 唐僧 40 較差n
統計病人數量
#統計數據框的行數,即可統計病人的數量n> patientNumber <- nrow(patientdata)n> patientNumbern[1] 4n
統計多少人患「1型糖尿病」
#第一步:查找1型糖尿病病人n> type1 <- patientdata[patientdata$diabetes == "1型糖尿病",]#此次該有「,」n> type1n patientID name age diabetes statusn1 1 悟空 30 1型糖尿病 較差n3 3 沙僧 35 1型糖尿病 顯著好轉n
#第二步:統計人數n> typeNumber <- nrow(type2)n> typeNumbern[1] 2n
增加一行數據
#第一步:創建一個新的數據框n> patientID <- c(5)n> age <- c(35)n> diabetes <- c(1型糖尿病)n> status <- c("較差")n> name <- c("白龍")n> newPatient <-data.frame(patientID,name,age,diabetes,status,stringsAsFactors = FALSE)n> newPatientn patientID name age diabetes statusn1 5 白龍馬 35 1型糖尿病 較差n#第二步:添加新的數據框n> patientdata <- rbind(patientdata,newPatient)n> patientdatan patientID name age diabetes statusn1 1 悟空 30 1型糖尿病 較差n2 2 八戒 28 2型糖尿病 好轉n3 3 沙僧 35 1型糖尿病 顯著好轉n4 4 唐僧 40 2型糖尿病 較差n5 5 白龍 35 1型糖尿病 較差n
增加一列數據
> inTime <c("10/2/2016","8/4/2015","23/8/2017","12/6/2014","24/9/2017")n> patientdata <- cbind(patientdata,inTime)n> patientdatan patientID name age diabetes status inTimen1 1 悟空 30 1型糖尿病 較差 10/2/2016n2 2 八戒 28 2型糖尿病 好轉 8/4/2015n3 3 沙僧 35 1型糖尿病 顯著好轉 23/8/2017n4 4 唐僧 40 2型糖尿病 較差 12/6/2014n5 5 白龍 35 1型糖尿病 較差 24/9/2017n
列表:list()
> a <- "Example for List"n> title <- "Example for List"nnames <-c("Cameron","Dell","Mike","Sunny")n> age <- c(30,31,23,32)n> j <- matrix(1:20,nrow = 4,ncol = 5)nm <- data.frame(names,age)nnn> mylist <- list(title=a,name=names,j,m)n> mylistn[1] "Example for List"nn$namen[1] "Cameron" "Dell" "Mike" "Sunny" nn[[3]]n [,1] [,2] [,3] [,4] [,5]n[1,] 1 5 9 13 17n[2,] 2 6 10 14 18n[3,] 3 7 11 15 19n[4,] 4 8 12 16 20nn[[4]]n names agen1 Cameron 30n2 Dell 31n3 Mike 23n4 Sunny 32n
列出1型糖尿病人數據並統計數量
> patientdatan patientID name age diabetes status inTimen1 1 悟空 30 1型糖尿病 較差 10/2/2016n2 2 八戒 28 2型糖尿病 好轉 8/4/2015n3 3 沙僧 35 1型糖尿病 顯著好轉 23/8/2017n4 4 唐僧 40 2型糖尿病 較差 12/6/2014n5 5 白龍馬 35 1型糖尿病 較差 24/9/2017n> type2 <- patientdata[patientdata$diabetes == "1型糖尿病",]n> type2n patientID name age diabetes status inTimen1 1 悟空 30 1型糖尿病 較差 10/2/2016n3 3 沙僧 35 1型糖尿病 顯著好轉 23/8/2017n5 5 白龍馬 35 1型糖尿病 較差 24/9/2017n> type2Number <- nrow(type2)n> type2Numbern[1] 3n> testList <- list(diabetesType1 = type2,number = type2Number)n> testListn$diabetesType1n patientID name age diabetes status inTimen1 1 悟空 30 1型糖尿病 較差 10/2/2016n3 3 沙僧 35 1型糖尿病 顯著好轉 23/8/2017n5 5 白龍馬 35 1型糖尿病 較差 24/9/2017n$numbern[1] 3n
查找列表中的元素
> number <- testList[["1型糖尿病人數"]]n> numbern[1] 3n
查找1型糖尿病員列表中處於「顯著好轉」的病員信息
$diabetesType1n patientID name age diabetes status inTimen1 1 悟空 30 1型糖尿病 較差 10/2/2016n3 3 沙僧 35 1型糖尿病 顯著好轉 23/8/2017n5 5 白龍馬 35 1型糖尿病 較差 24/9/2017n$`1型糖尿病人數`n[1] 3n> info <- testList[1]$diabetesType1[testList[1]$diabetesType1$status == "顯著好轉",]#這是我在自娛自樂,哈哈~n> infon patientID name age diabetes status inTimen3 3 沙僧 35 1型糖尿病 顯著好轉 23/8/2017n
此刻,我相信,我已經找到了編寫R語言代碼的樂趣了!各種各樣的建築材料擺在我面前,搭建什麼樣的房子?如何來搭建?有想法就付出行動,你會立刻得到來自R世界的反饋!
推薦閱讀:
※HR Analyse
※如何判斷一 部電影值不值得看?
※R的矩陣相乘/逆矩陣
※第一關:開啟大數據學習之路
※零基礎學習R語言數據分析