標籤:

《第二講:數據結構入門》學習筆記與實踐

根據大數據學習課程進度的要求,在聽第二講之前需要預習《R語言實戰》第1,2章的內容。看完第1章的內容,安裝好了R,照著書中的代碼敲了1遍,慢慢有了了解。但是看第2章數據集的時候就有點不好理解,看完一遍感覺是蒙圈的。後來我又斷斷續續看了幾遍,怕自己理解不夠的話聽猴子的live講座會很吃力,但自己找書看確實效果不是很好,看到學習群里很多同學都發出了學習筆記,我也硬著頭皮去聽live了。後來發現,第一遍看書預習有不懂的地方很正常,通過猴子的講解後再回過去理解書中的內容就會輕鬆很多,最最重要的是,跟著猴子的源代碼一個個敲,這一步對初學者來說太必不可少啦。

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導入數據實踐

首先安裝xlsx包,xlsxjars和rJava包,在安裝xlsx包的時候,R會自動安裝另外兩個包。另外還要安裝JAVA(java.com: Java + You)。

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:大數據 |