《第二講:數據結構入門》學習筆記與實踐
Rstudio真是好東西,在聽live之前,我還是在R上傻傻對著書本中的代碼一個個敲進去,感覺效率好低。在安裝了Rstudio之後,發現它真的太方便了,輸入代碼特別智能,報錯功能特別醒目,輸出結果特別直觀。有一次我少輸入了一個逗號,結果在保存的時候發現如下報錯,把滑鼠移到紅色波浪線下面,就會顯示具體錯誤信息。有了Rstudio, 我愛上了敲代碼。
本講的主要內容是數據結構的分類和用法,主要有向量,矩陣,數組,數據框,列表,因子。因子在本講中沒有具體舉例。於是我照葫蘆畫瓢,按照猴子提供的源代碼一個個敲進自己的project。1,向量(vector):用於存儲數值型、字元型或邏輯型數據的一維數組
# 數值型 age <- c(29, 34, 28, 52) # 字元型 diabetes <- c("1型糖尿病", "2型糖尿病","1型糖尿病", "2型糖尿病") #邏輯型 c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
2,矩陣(matrix):一個二維數組,每個元素都有相同的模式(數值型、字元型或邏輯型)
#定義一個2*2的矩陣#矩陣里的元素data <- c(1,2,3,4,5,6);#行名rnames <- c("r1","r2");#列名cnames <- c("c1","c2","c3");a <- matrix(data = data, nrow = 2,ncol = 3, byrow = TRUE, dimnames = list(rnames, cnames))
可以通過中括弧[ ]訪問矩陣中的元素。
3,數組(array):與矩陣類似,但是維度可以大於2
# myarray <- array(vector,dimensions,dimnames)# vector包含了數組中的數據,dimensions是一個數值型向量,給出了各個維度下標的最大 值,dimnames是可選的,各維度名稱標籤的列表
4,數據框(datastructure):不同的列可以包含不同模式(數值型、字元型等)的數據
數據框可通過函數data.frame()創建:
mydata <- data.frame(col1, col2, col3,...)
其中的列向量col1、col2、col3等可為任何類型(如字元型、數值型或邏輯型)。每一列的名
稱可由函數names指定。創建一個patientdata數據框:
#病人編號patientID <- c(1, 2, 3, 4);#姓名name <- c(猴子,李同, 王五,張三);#病人年齡age <- c(29, 34, 28, 52);#糖尿病類型diabetes <- c("1型糖尿病","2型糖尿病", "1型糖尿病","2型糖尿病");#病情status <- c("較差","好轉", "顯著好轉","較差");patientdata <- data.frame(patientID,name,age, diabetes,status, stringsAsFactors = FALSE);
# 在數據框的使用中可以通過美元符號$查找每一列
age1 <- patientdata$age# 選取其中一部分subdata <- patientdata[c("diabetes","status")]# 統計某類病人數量#step1:查找"1型糖尿病"的病人
type1 <- patientdata[patientdata$diabetes == "1型糖尿病",];#step2:統計病人數type1.number <- nrow(type1);通過rbind和cbind增加行和列。
在敲代碼的過程中第一次忘了在1型糖尿病的後面加逗號:
type1 <- patientdata[patientdata$diabetes == "1型糖尿病"]
輸出的結果如下:並不是想要的結果
加上逗號後:
type1 <- patientdata[patientdata$diabetes == "1型糖尿病",]
輸出結果正確:
逗號的作用還需要多留意,在以後的編程實踐中,要注意逗號的用法。5,列表(list):是R的數據類型中最為複雜的一種。一般來說,列表就是一些對象(或成 分,component)的有序集合。
mylist <- list(object1, object2, ...)
其中的對象可以是目前為止講到的任何結構。你還可以為列表中的對象命名:
mylist <- list(name1=object1, name2=object2, ...)
在猴子的源代碼中有一段有點問題:
type1 <- patientdata[patientdata$diabetes =="1型糖尿病",];number <- nrow(patientdata);kpi <- list(flag=flag, diabetesType1=diabetesType1, diabetesType1.number=diabetesType1.number, age=age);
執行後會報錯: object diabetesType1 not found。
我修改後的代碼如下:
type1 <- patientdata[patientdata$diabetes == "1型糖尿病",];number <- nrow(patientdata);type1.number <- nrow(type1);kpi <- list(flag = flag, diabetesType1 = type1, diabetesType1.number = type1.number, age = age);
另外有個小小疑惑:猴子提供的源代碼每一句代碼最後都加一個分號;我把分號去掉後執行同樣成功,於是我就google了一下,發現來自 Google 的 R 語言編碼風格指南上說分號沒用。不知道這是不是猴子的編程習慣還是另有用處?
- 從excel導入數據實踐
install.packages(xlsx)
安裝完成後,開始讀取病例數據excel表格的內容:
# 打開包library(xlsx)# 將病例數據讀取到workbookworkbook <- "f:/Rprojects/病例數據.xlsx"# 將病例數據存儲為數據框mydataframe <- read.xlsx(workbook, 1, encoding=UTF-8)
其中read.xlsx()中1表示workbook的第一張表格,加了encoding=UTF-8可以使中文正常顯示,不然會顯示亂碼。(google)
接下來簡單數據分析統計有多少病人和患1型糖尿病的人數。> # 統計病人總數> patientNumber <- nrow(mydataframe)> > # 第一步,查找1型糖尿病人> type1 <- mydataframe[mydataframe$糖尿病類型 == "1型糖尿病", ]> View(type1)> # 第二步,統計人數> type1.number <- nrow(type1)> patientNumber[1] 4> type1.number[1] 2
- 小結:多實踐多敲代碼,遇到困難可以先繞過去,過段時間回過頭來可能就解決了,一定不能放棄
推薦閱讀:
※從單租戶IaaS到多租戶PaaS——金融級別大數據平台MaxCompute的多租戶隔離實踐
※物聯網、大數據、雲計算三者之間的關係為何?
※如何利用八爪魚,實現餐飲大數據(以辰智商圈秀為例)
※移動互聯網大數據匯總,雞年我們都幹了點啥?
※為什麼說「大數據」可能被人們過度神化了
TAG:大數據 |