R2——創(chuàng)建數(shù)據(jù)集
@(R2)
前言
創(chuàng)建和讀取含有研究信息的數(shù)據(jù)是數(shù)據(jù)分析的第一步。在R中,這個任務(wù)包含以下三步:
- 選擇一種數(shù)據(jù)結(jié)構(gòu)儲存數(shù)據(jù)
- 講數(shù)據(jù)輸入或?qū)氲竭@個數(shù)據(jù)結(jié)構(gòu)中
- 對數(shù)據(jù)進(jìn)行預(yù)處理,比如結(jié)構(gòu)化數(shù)據(jù)
本章回答了如下幾個問題:
- R中儲存和使用的數(shù)據(jù)結(jié)構(gòu)有哪些?
- 如何讀取各類來源的數(shù)據(jù)?
- 如何對讀取的數(shù)據(jù)進(jìn)行標(biāo)注處理?
- 在實際中可能使用到哪些處理數(shù)據(jù)集的函數(shù)?
數(shù)據(jù)集的概念
數(shù)據(jù)集通常是由數(shù)據(jù)構(gòu)成的一個矩陣數(shù)組,行表示觀測,列表示變量。如下圖:

R可以處理的數(shù)據(jù)類型(模式)如下圖:

數(shù)據(jù)結(jié)構(gòu)
section1 向量
向量:用于存儲數(shù)值型、字符型或邏輯型數(shù)據(jù)的一維數(shù)組。
值得注意的是,單個向量中的數(shù)據(jù)必須有相同的類型或模式。同一向量中無法混雜不同模式的數(shù)據(jù)。
標(biāo)量是只含一個元素的向量,例如f<-3,g<-"US"等。它們用于保存常量。
如何創(chuàng)建向量?
a <- c(1,2,3,4)
b <- c("one","two")
c <- c(TRUE,FALSE,TRUE)
如何讀取向量中的元素?
a <- c("k","g","j","h","q","w","t","u","i")
a[3]
a[c(1,2,4)]
a[2:6]
section2 矩陣
矩陣:是一個二維數(shù)組,其中每個元素都擁有相同的模式。
如何創(chuàng)建矩陣?
mymatrix <- matrix(vector, nrow=number_of_row, ncol=number_of_col, byrow=logical_value, dimnames=list(char_vector_rownames,char_vector_colnames))
byrow意味著矩陣按行填充,默認(rèn)情況是按列填充。
如何讀取矩陣中的元素?
X[i,]
#讀取矩陣第i行
x[,j]
#讀取矩陣第j列
x[i,j]
#讀取矩陣第i行第j列的元素
#同時,i和j可以為數(shù)值型向量,比如1:2,c(1,2,3)等
x[i]
#讀取矩陣按行展開的第i個元素
section3 數(shù)組
數(shù)組與矩陣類型,但是維度可以大于2。其中數(shù)組中每一個維度只能有一種模式。
如何創(chuàng)建數(shù)組?
myarray <- array(vector, dimensions=c(nrow, ncol, dimension), dimnames=list())
#vector中包含數(shù)組中的數(shù)據(jù);
#dimension是一個數(shù)值型向量,給出各個維度下標(biāo)的最大值,數(shù)組的中數(shù)據(jù)的存儲量由該變量決定;
#dimnames是可選的、各維度名稱標(biāo)簽的列表。
如何讀取數(shù)組中的元素?
讀取方式和矩陣中讀取方式類似,只是多了一個維度。
section4 數(shù)據(jù)框
數(shù)據(jù)框:不同列可以包含不同模式的數(shù)據(jù)的矩陣。
如何創(chuàng)建數(shù)據(jù)框?
mydata <- data.frame(col1, col2, col3, ...)
如何讀取數(shù)據(jù)框中的數(shù)據(jù)?
x[i,]
#讀取數(shù)據(jù)框第i行
x[,j]
#讀取數(shù)據(jù)框第j列
x[i,j]
#讀取數(shù)據(jù)框第i行第j列的元素
#同時,i和j可以為數(shù)值型向量,比如1:2,c(1,2,3)等
x[i]
#讀取數(shù)據(jù)框第i列
x$varible_name
#讀取數(shù)據(jù)框中行名為varible_name的行
簡讀取數(shù)據(jù)框中的變量的兩個方法?
- 使用attach()函數(shù),即可將數(shù)據(jù)框添加到R的搜索路徑中。同時,使用detach()函數(shù),可以將數(shù)據(jù)框從搜索路徑中移出。簡言之,attach()可以調(diào)用數(shù)據(jù)框中變量,detach()可以消除這種調(diào)用。如果不用detach()的話,數(shù)據(jù)框中的變量名會保存在R的工作空間中,這可能會對后續(xù)的變量命名帶來影響。所以,使用detach()是一個好的編程習(xí)慣。
- 使用with()函數(shù),可以解決讀取數(shù)據(jù)框中的變量后其保存在R工作空間的問題。因為with()函數(shù)會創(chuàng)造出一個和原始工作空間相對獨(dú)立的保險箱,在保險箱中調(diào)用數(shù)據(jù)框的變量將不會保存在R的工作空間中;同時,如果需要保存到R的工作空間中,可以使用<<-命名符對變量進(jìn)行命名。
with()的使用方法:
with(mtcars,{ nokeepstats <- summary(mpg) keepstas <<- summary(mpg) })
如何在數(shù)據(jù)框中對數(shù)據(jù)進(jìn)行實例標(biāo)志?
在R中,實例標(biāo)識符(case identifier)可通過數(shù)據(jù)框操作函數(shù)中的rowname選項進(jìn)行。
patientdata <- data.frame(patientID, age, diabetes, status, row.name=patientID)
section5 因子
因子(factor)在R中分為名義型變量和有序型變量。
如何創(chuàng)建因子?
factor()函數(shù)以一個整數(shù)向量的形式存儲類別值,整數(shù)的取值范圍是[1...k](其中k是名義變量中唯一值的個數(shù)),同時一個由字符串(原始值)組成的內(nèi)部向量將映射到這些整數(shù)上。
status <- c("poor","Improved","Excellent","poor")
status <- factor(status, order=TRUE, levels=c("poor","Improved","Excellent"))
#創(chuàng)建有序型變量;規(guī)定levels
sex <- c(1,2,1)
sec <- factor(sex, levels=c(1,2),labels=("Male","Female"))
#創(chuàng)建名義型變量;規(guī)定levels;給名義型變量貼標(biāo)簽
section6 列表
列表:是一些對象(component)的有序集合。列表允許用戶整合若干(可能無關(guān)的)對象到單個對象名下。但是對象中數(shù)據(jù)的模式必須是單一的。
如何創(chuàng)建列表?
mylist <- list(name1=object1, name2=object2, ...)
如何讀取列表中的元素?
mylist[[i]]
#讀取第i個成分
mylist[[char_name]]
mylist$char_name
#讀取名為char_name的成分
mylist[[i]][j]
#讀取第i個成分中的第j個元素;矩陣的用法類似
數(shù)據(jù)的輸入
section1 手動輸入
edit()函數(shù)
即使是手動輸入,肯定也是在excel中進(jìn)行,所以此函數(shù)意義不大??赡苤皇翘峁┮环N功能,以防萬一。
section2 文本文件的錄入
文本文件是現(xiàn)在比較常見的數(shù)據(jù)處理類型,所以會花較多時間進(jìn)行學(xué)習(xí)。文本文件分為兩種,一是結(jié)構(gòu)化數(shù)據(jù),二是非結(jié)構(gòu)化數(shù)據(jù)。通常情況下,我們需要對非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行結(jié)構(gòu)化處理,以得到可以分析的數(shù)據(jù)。
結(jié)構(gòu)化數(shù)據(jù):由二維表結(jié)構(gòu)來邏輯表達(dá)和實現(xiàn)的數(shù)據(jù)。
非結(jié)構(gòu)化數(shù)據(jù):數(shù)據(jù)結(jié)構(gòu)不規(guī)則或不完整,沒有預(yù)定義的數(shù)據(jù)模型,不方便用數(shù)據(jù)庫二維邏輯表來表現(xiàn)的數(shù)據(jù)。
二維表:在關(guān)系模型中,數(shù)據(jù)結(jié)構(gòu)表示為一個二維表,一個關(guān)系就是二維表。通常,表中每一行稱為一個記錄或一個元組,每一列稱為一個字段或?qū)傩浴?br> 簡言之,結(jié)構(gòu)化數(shù)據(jù)是類似于數(shù)據(jù)框或列表形式的數(shù)據(jù)。
設(shè)定工作空間
通常情況下,需要把待讀取的數(shù)據(jù)文件放入R指定的工作空間中,R的函數(shù)才能正確的讀取文件。當(dāng)然,也有人習(xí)慣輸入文件的完整路徑。
R:
getwd()
#show ur working directory
setwd(ur_workspace_direction)
#then put ur file into that workspace
mydata <- read.table("file_name")
#If u want to set it temporary,u need to type setwd(ur_workspace_direction) in Rprofile.site
RStudio:
#Tools - Global Option - General - Default working directory
read.table()
read.table()可讀入一個表格格式的文件并將其保存為一個數(shù)據(jù)框。
mydata <- read.table("file_name", header=logical_value, sep="", row.names=char_vector_rownames, col.names=char_vector_colnames, na.strings=vector, colClasses=vector, quote="", skip=numberic, stringsAsFactors=logical_value, text=char_vector)

read.table()中默認(rèn)header=FALSE。
中文文本讀入時,偶爾會出現(xiàn)編碼錯誤,大多可通過加入encoding="UTF-8"解決。
read.csv()
read.csv():直接讀取csv(Comma Separated Values)的函數(shù)。其中header的默認(rèn)值是TRUE。
read_excel()
在R中不能直接讀取xls/xlsx文件,同時xls/xlsx數(shù)據(jù)格式不如csv的跨平臺兼容性更好。所以,推薦將其另存為csv格式,再進(jìn)行讀取。
當(dāng)然,也可以直接讀取xls/xlsx文件,前提是安裝readxl包:
install.packages("readxl")
library(readxl)
mydata <- read_excel("file_name",col_names = T)
#詳細(xì)的參數(shù)調(diào)用看文檔
readLines()
以上介紹的函數(shù)都是用來讀取結(jié)構(gòu)化數(shù)據(jù)的,現(xiàn)在來介紹讀取非結(jié)構(gòu)化數(shù)據(jù)的函數(shù)——readLines()。
readLines()必需的參數(shù)只有一個文件名,中文文檔需要留意編碼參數(shù),即可實現(xiàn)文本按行讀入,然后每一行作為一個字符存儲起來,所以整個文本文件讀取的是一個大字符串。
數(shù)據(jù)的標(biāo)注
通常情況下,數(shù)據(jù)分析人員會對數(shù)據(jù)集進(jìn)行標(biāo)注,包括為變量名添加描述性標(biāo)簽,以及為類別型變量中的編碼添加值標(biāo)簽。
變量標(biāo)簽
R中處理變量標(biāo)簽的能力有限。所以最好使用簡潔和易區(qū)分的變量名進(jìn)行命名。
值標(biāo)簽
factor()可對類別型變量創(chuàng)建值標(biāo)簽。
laonainai <- facotr(mygroup, levels=c(1,2), labels=c("male","female"))
處理數(shù)據(jù)對象的實用函數(shù)


參考資料
R語千尋 | 數(shù)據(jù)的讀入
R語千尋 | 非結(jié)構(gòu)化數(shù)據(jù)--文本數(shù)據(jù)的讀入
R語言實戰(zhàn)(第2版)