《R語言實戰》第一二章節學習筆記

  感謝Robert I.Kabacoff 著作本書,同時感謝高濤、肖楠、陳鋼編譯此書。

  最近在學習《R語言實戰》,特將學習過程記錄下來,供各位朋友參考,雖說是筆記,但是90%是書中內容,另外10%是自己偶爾冒出的一點點想法的記錄和一些疑問,希望互相探討。末尾有本章的代碼清單下載地址,與各位交流,還是提倡按照書中內容把代碼一個個敲出來。

第一章 R語言介紹

自定義啓動環境以自動載入會頻繁使用的包 ——P14

問: 如何自定義啓動環境?

常見錯誤類型

  • 注意大小寫
  • 注意引號與括號是否漏了;
  • 路徑名稱使用 “/” 或者 “\”;
  • 是否使用未載入包的函數




第二章 創建數據集

 按照個人要求的格式來創建含有研究信息的數據集是數據分析的第一步。這個任務包括以下兩步:

  • 選擇一種數據結構來存儲數據
  • 將數據輸入或導入到這個結構中

      本章的第一部分(2.1~2.2節)敘述了R中用於存儲數據的多種結構。

      本章的第二部分(2.3節)涵蓋了多種向R中導入數據的可行方法,通常,你只需要其中的一兩種方法。

      本章的第三部分(2.4節)將討論數據集的標註問題,並在2.5節介紹一些處理數據集的使用函數。



2.1 數據集的概念


由數據構成的矩形數組,行表示觀測,列表示變量

  不同行業對於數據集的行列叫法不同,統計學家稱之爲 觀測 (observation)和 變量 (variable),
數據庫分析師稱之爲 記錄 (record)和 字段 (field),數據挖掘/機器學習學科的研究者則把他們叫
示例(example)和屬性(attribute)。



2.2數據結構

  包括標量、向量、矩陣、數組、數據庫和列表。

2.2.1 向量

用於存儲數值型、字符型或邏輯型數據的一維數組。用函數c()可創建向量。

例如

a <- c(2,1,5,6,4)

b <- c(“北京”,”上海”,廣州”,”深圳”)

c <- c(TRUE,TRUE,FALSE,FALSE)

注意

標量是隻含有一個元素的向量,例如f <- 2、g <- “中國”和h <- TRUE。它們用於保存常量。

  訪問向量中的指定元素可用方括號表示,如:a[c(2,4)],用於訪問a中的第二個和第四個元素,即1和6。

2.2.2 矩陣

  矩陣是一個二維數組,只是每個人元素都擁有相同的模式(數值型、字符型或邏輯型)用函數matrix來創建矩陣。

myymatrix <- matrix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list(char_vector_rownames,char_vector_colnames))

  其中vector包含了矩陣的元素,nrow和ncol用於指定行和列的維數,dimnames包含了可選的,以字符型向量表示的行名和列名,選項byrows則表明矩陣應當按行填充(byrow=TRUE)還是按列填充(byrow=FALSE),默認是按列填充。

  提取矩陣中的元素時用[,],其中逗號前後分辨是,行數和列數。

如:
`x <- matrix(1:10,nrow=2) #創建一個1到10、兩行的矩陣。

x #查看矩陣內容。

x[2,] #查看x中,第二行的元素,即2 4 6 8 10。

x[,2] #查看x中,第二列的元素,即3 4。

x[1,4] #查看x中,第一行,第四列的元素,即7。

x[1,c(4,5)] #查看x中,第一行,第四、五列的元素,即7 9。`

2.2.3 數組

  與矩陣類似,但是維度可以大於2。可通過函數array來創建,形式如下:

myarry <- array(vector,dimensions,dimnames)

  其中vector包含了數組中的數據,dimensions是一個數值型向量,給出了各個維度下標的最大值,而dimnames是可選的、各維度名稱標籤的列表。

問:

  • 既然維度可以大於2,那麼當維度爲3、4的時候,是怎樣的形式?

  • 下標是什麼意思?

2.2.4 數據框

  在R中最常處理的數據結構,不同列可以包含不同模式(數值型、字符型等)的數據,同一列的數據模式必須相同。可通過函數data.frame()來創建,如:

mydata <- data.frame(col1,col2,col3,…)

  其中的列向量col1,col2,col3,…可爲任意類型,(如數值型、字符型或邏輯型)每一列的名稱可由函數names指定。

  使用$來提取數據狂中的特定元素,但是每次都輸入數據框名,有點麻煩,用attach(),detach()和with()函數來簡化代碼。

1. attach(),detach()和with()函數

  函數attach()可以將數據庫添加到R的搜索路徑中,函數detach()將數據框從搜索路徑中移除,
和with()函數

**當名稱相同的對象不止一個時,attach()與detach()組合的方式,侷限性就很明顯。
當環境中已經有一個此名稱的對象時,原始對象取得優先權。**

  使用with()的侷限性在於,賦值僅在此函數的括號內生效,如果需要創建with()結構以外存在的對象,使用特殊賦值符<<- 替代標準賦值符(<-),它可以將對象保存到with()以外的全局環境中。

2. 實例標識符

  在R中,可通過數據框操作函數中的rowname選項將對象指定爲R中標記各類打印輸出和圖形中實例名稱所用的變量。如:

patientdata <- data.frame(patientID,age,diabetes,status,row.names=patientID)

2.2.5 因子

變量分爲名義型、有序型或連續型變量。

  • 名義型變量是沒有順序的類別型變量。如病人患病類型(Type1、Type2)。
  • 有序型變量表示一種順序,而非數量關係的變量。如病情(很差、較好、痊癒)。
  • 連續型變量可以呈現爲某個範圍內的任意值,並同時表示了順序和數量。
類別 順序關係 數量關係
名義型變量
無序型變量
連續型變量

  其中的名義型變量和有序型變量都是因子,因子很重要,因爲它決定了數據的分析方式以及如何進行視覺呈現。

  函數factor()以一個整數向量的形式存儲類別值,整數的取值範圍是[1~k](其中k是名義型變量中唯一值得個數),同時一個由字符串(原始值)組成的內部向量將映射到這些整數上。要表示有序型變量需爲函數factor()指定參數ordered()

  這裏對向量的編碼使用的是字母順序,可以通過指定levels選項來覆蓋默認排序。

四分位數

將n個數值從小到大排列,分別在20%,50%,75%的位置

Q1的位置= (n+1) × 0.25

Q2的位置= (n+1) × 0.5

Q3的位置= (n+1) × 0.75

2.2.6 列表

  是R中最爲複雜的一張數據類型,是一些對象(或成分,component)的有序集合。用函數list()來創建。

mylist <- list(obecjt1,obecjt2,…)

  其中的對象可以是目前爲止講到的任何結構。還可以爲列表中的對象命名。

mykist <- list(name1 = obecjt,name2 = obecjt2,…)

  兩個原因讓列表成爲了R中的重要數據結構。

1. 列表允許以一種簡單的方式組織和重新調用不想幹的信息

2. 許多R函數的運行結果都是以列表的形式返回的

R語言中的不尋常特性
P30
  • 對象名稱中的句點(.)沒有特殊意義。但美元符號(A x是指數據框A中的變量x。

  • R不提供多行註釋或塊註釋功能,必須以#作爲多行註釋每行的開始。出於調試的目的,你也可以把想讓解釋器忽略的代碼放到語句if(FALSE){……}中。將FALSE改爲TRUE即允許這塊代碼執行。

  • 將一個指賦給某個向量、矩陣、數組或列表中一個不存在的元素時,R將自動擴展這個數據結構以容納新值。如:

x <- c(8,6,4)
x[7] <- 10
x
[1] 8 6 4 NA NA NA 10

通過賦值,向量x由三個元素擴展到了七個元素,
x <- x[1:3]會重新將其縮減回三個元素。

  • R中沒有標量,標量以氮元素向量的形式出現。
  • R中的下標不從0開始,而從1開始。在上述向量中,x[1]的值爲8。
  • 變量無法被聲明。它們在首次被賦值時生成。



2.3 數據的輸入

2.3.1 使用鍵盤輸入數據

  使用函數edit()會自動調用一個允許手動輸入數據的文本編輯器。具體步驟如下:

  1. 創建一個空數據框(或矩陣),其中變量名和變量的模式需與理想中的最終數據集一致;
  2. 針對這個數據對象調用文本編輯器,輸入你的數據,並將最終結果保存回此數據對象中。

mydata <- edit(mydata) 可以等價於 fix(mydata)

2.3.2 從帶分隔符的文本文件中導入數據

  使用read.tabe()函數語法如下:

mydataframe <- read.table(file,header=logical_value,sep="delimiter",row.names="name")

  其中,file是一個帶分隔符的ASCII文本文件,header是一個表明首行是否包含了變量名的邏輯值(TRUE或FALSE),sep用來指定分隔數據的分隔符,row.names是一個可選參數,用以指定一個或多個表示行表示符的變量。

符號 表示方法 ASCCI碼 概念/作用/意義
空白符 ” “ 32 空白
(水平)製表符 “\t” 9 4個或8個空白符
換行符 “\n” 10 將光標移至下一行
回車符 “\r” 13 讓光標移至行首
垂直製表符 “\v” 11 垂直打出幾個空格,打印機才能顯示

  默認情況下,字符型變量將轉換爲因子,如果不想這樣,有很多種方法可以禁止這種轉換行爲。其中包括設置選項stringsAsFactors = FSLSE,另一種方法是使用選項colClasses爲每一列指定一個類,如logical(邏輯型)、numeric(數值型)、character(字符型)、factor(因子)。

2.3.3 導入Excel數據

  可以將Excel文件導出爲一個逗號分隔文件(csv),並使用前文額方式導入R中。

  在Windows系統中,可以用RODBC包來訪問Excel文件。

  下載安裝好RODBC包之後,可用read.xlsx/xls(file,n)來讀取數據,其中file表示文件的路徑,需用”file”表示,n表示要導入的工作表序號。

  書中使用了xlsx包,在下載此包之前,需做以下步驟:

  1. 在JAVA官網下載JDK安裝,並設置環境變量。(操作方式
  2. 在R中下載rjava包,載入;
  3. 在R中下載xlsxjars包,載入;
  4. 在R中下載xlsx包,載入;
  5. 使用書中範例進行操作。

2.3.4 導入XML數據

參閱網址

2.3.5 從網頁抓取數據

  1. 使用reanLines()下載網頁
  2. 使用grep()和gsub()一類的函數進行處理

  對於結構複雜的網頁,使用RCurl包和XML包來提取想要的信息。在載入RCurl包之前需載入bitops包。

找到“Webscraping using readLines and RCurl”一文

2.3.6 導入SPSS數據

  用foreign包的函數read.spss(),也可用Hmisc包的函數spss.get(),後者是對前者的一個封裝,可自動設置後者的許多參數,讓轉換結果更加簡單一致。Hmisc包需載入。

注意:在載入Hmisc包之前需要載入以下幾個包。

  1. lattice包


    install.packages("lattice")
    library(lattice)

  2. survival包


    install.packages("survival")
    library(survival)

  3. Formula包


    install.packages("Formula")
    library(Formula)

  4. ggplot2包


    install.packages("ggplot2")
    library(ggplot2)

      然後就可以用spss.get()函數來導入數據了,如:


    mydataframe <- spss.get("mydata.sav),use.value.labels = TRUE)

      其中,mydata.sav是需要導入的spss文件,use.value.label = TRUE表示讓函數將帶有值標籤的變量導入爲R中水平對應相同的因子,mydataframe是導入後的R數據框。

2.3.7 導入SAS數據

  使用foreign包的read.ssd()函數或者Hmisc包的sas.get()函數都可以,倘若使用的SAS是9.1或者更高版本,則這些函數無法正常使用。因爲R尚未跟進SAS對文件結構的改動。可以使用以下兩種方案:

  1. 在SAS中使用PROC EXPORT將SAS數據集保存爲一個逗號分隔的文本文件,並使用2.3.2節中敘述的方法將導出的文件讀取到R中,如:

SAS程序:


proc exprot data = mydata


outfile = "mydata.csv


dbms = csv;


run;


R程序


mydata <- read.table("mydata.csv",header = TRUE,sep = ",")

  另外,一款名爲Stat/Transfer的商業軟件(在2.3.12節介紹)可以完好地將SAS數據集(包括任何一支的變量格式)保存WieR數據框。

2.3.8 導入Stata數據

  在R中使用類似代碼:

library(foreign)
mydataframe <- read.dta("mydata.dta")

  其中,mydat.dta是Stata數據集,mydataframe是返回的R數據框。

2.3.9 導入netCDF數據

  Unidata項目主導的開源軟件庫netCDF(network Common Data Form,網絡通用數據格式)定義了一種機器無關的數據格式,可用於創建和分發面向數組的科學數據。netCDF格式通常用來存儲地球物理數據。ncdf包和ncf4包爲netCDF文件提供了高層的R接口。

  1. 什麼叫做機器無關?
  2. 高層的R接口是什麼意思?
  3. 這兩個包與普通的R包有什麼區別?

  ncdf包爲版本3或更早版本的netCDF庫創建的數據文件提供了支持,在windows、Mac OS X和Liunx平臺上均可使用。ncdf4包支持netCDF 4或更早的版本,在windows平臺上不可用。

使用以下代碼:
library(ncdf)


nc <- nc_open("mybetCDFfile")


myarray <- get.var.ncdf(nc,myvar)

  在本例中,對於包含netCDF文件mybetCDFfile中的變量myvar,其所有數據都被讀取並保存到了一個名爲myarray的R數組中。

  **值得注意的是:**ncdf和ncdf4包最近進行來了重大升級,使用方式可能與舊版本不同,另外這兩個包中的函數名稱也不同。請閱讀在線文檔以瞭解詳情。

2.3.10 導入HDF5數據

  hdf全稱是Hierarchical Data Format,分層數據格式,用於管理超大型和結構極端複雜數據集的軟件技術方案。在安裝了HDF5庫(1.2版或更高)之後,可以用hdf5包讀取HDF5的數據。

2.3.11 訪問數據庫管理系統

  在R中,通過兩種方式來獲取關係型數據框管理系統(DSMS),一部分是通過原生的數據框驅動來提供訪問功能,另一部分是通過ODBC或JDBC來實現訪問的。

1. ODBC接口

  在R中使用ODBC包訪問一個數據框,能連接到任意一種擁有ODBC驅動的數據庫。步驟如下:

  • 針對你的系統和數據框類型安裝和配置合適的ODBC驅動。
  • 在R中安裝載入RODBC包。

RODBC包中的函數

函 數
描 述
odbcConnect(dsn,uid = “”,pwd = “”) 建立一個到ODBC數據庫的連接
sqlSetch(channel,sqltable) 讀取ODBC數據庫中的某個表到一個數據框中
sqlQuery(channel,query) 向ODBC數據庫提交一個查詢並返回結果
sqlSave(channel,mydf,tablename = sqtable
append = FALSE)
將數據框寫入或更新(append = TRUE)到ODBC
數據庫的某個表中
sqlDrop(channel,sqtable) 刪除ODBC數據庫中對的某個表
close(channel) 關閉連接

   RODBC包可以允許R和一個通過ODBC連接的SQL數據庫之間進行雙向通信。不僅可以讀取數據還可以通過R修改數據庫中的內容。

library(RODBC)


myconn <- odbcConnect("mydsn",uid = "Rob",pwd = "aardvark")


crimedat <- sqlFetch(myconn,Crime)


pundat <- sqlQuery(myconn,"select * from Punishment")


close(myconn)

① 載入RODBC包

② 通過一個已註冊的數據源名稱(mydsn)和用戶名(rob)以及密碼(aardvark)打開了一個ODBC數據庫連接。

③ 連接字符串被傳遞給sqlFetch,它將Crime表賦值到R數據框crimedat中。

④ 對Punishment表執行了SQL語句select並將結果保存到pundat中。

⑤ 關閉連接。

問:

  1. 關閉連接是否是必須的?
  2. 不關閉連接會怎樣?

2. DBI相關包

  DBI相關包爲訪問數據庫提供了一個通用且一致的客戶端接口。使用時請確保安裝了針對你的系統和數據庫的必要JDBC驅動。詳細請參閱CRAN


問:

  1. 兩個接口有什麼區別?
  2. 哪一種更便捷,或者更爲普遍的使用?

2.3.12 通過Stat/Transfer導入數據

  一款可在34種數據格式之間做轉換的獨立應用程序。此軟件擁有Windows、Mac和Unix版本,支持前文敘述的各種統計軟件的最新版本。也可以銅鼓ODBC訪問如Oracle、Sybase、Informix和DB/2一類的數據庫管理系統。



2.4 數據集的標註

  爲了是結果更易解讀,通常會對數據集進行標註。通常這種標註包括爲變量名添加描述性標籤,以及爲類別型變量中的編碼添加值標籤。

2.4.1 變量標籤

  將變量標籤作爲變量名,然後通過位置下標來訪問這個變量。

  names(patientdata)[2] <- "Age at hostipalizantion (in years)"

  使用此串文中代碼,再輸入Age at hostipalizantion (in years)會報錯,這是爲什麼?

2.4.2 值標籤

  函數factor()可爲類別型變量創建值標籤 。在上例中,假設又一個名爲gender的變量,其中1表示男性,2表示女性。可以使用以下代碼。

  patientdata$gender <- factor(patientdata$gender,levels = c(1,2),labels = c("male","female"))

  這裏的levels代表變量的實際值,而labels表示包含了理想值標籤的字符型向量。



2.5 處理數據對象的實用函數

函 數 用 途
length(object) 顯示對象中國元素/成分的數量
dim(object) 顯示某個對象的維度
str(object) 顯示對象的結構
class(object) 顯示對象的類或類型
mode(object) 顯示對象的模式
names(object) 顯示對象中各成分的名稱
c(object,object,…) 將對象合併入一個對象
cbind(object,object,…) 按列合併對象
rbind(object,object…) 按行合併對象
Object 輸出某個對象
head(object) 列出對象的開始部分
ltail(object) 列出對象的最後部分
ls() 顯示當前的對象列表
rm(object,object,…) 刪除一個或更多個對象。語句rm(list = ls())
將刪除當前工作環境的幾乎所有對象①
newobject
> 注:① 以句點.開頭的隱藏對象將不受影響。

2.6 小結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章