博客 / 詳情

返回

R語言之數據獲取操作

文章和代碼已經歸檔至【Github倉庫:https://github.com/timerring/dive-into-AI 】或者公眾號【AIShareLab】回覆 R語言 也可獲取。

實際上,R 中有大量的內置數據集可用於分析和實踐,我們也可以在R 中創建模擬特定分佈的數據。而在實際工作中,數據分析者更多時候面對的是來自多種數據源的外部數據,即各式各樣擴展名的數據文件,如 .txt、.csv、.xlsx、.xls 等。不同擴展名的文件代表不同的文件格式,這常常會給分析者帶來困擾。

R 提供了適用範圍廣泛的數據導入工具。

1.獲取內置數據集

R 中的內置數據集存在於各個包中,其中基本包 datasets 裏只有數據集,沒有函數。這個包提供了近 100 個數據集,涵蓋醫學、自然、社會學等各個領域。

你可以用下面的命令進行查看:

data(package = "datasets")

如果想要調用某個數據集,可以使用 data( ) 函數。運行下面的命令,R 會加載數據集 iris 到工作空間。

data(iris)

除了 datasets 包,R 中很多其他的包也帶有數據集。如果不是運行 R 後自動加載的基本包,我們需要安裝和加載這些包以後才能使用其中的數據。下面以 MASS 包裏的數據集 bacteria 為例説明數據的調用過程:

library(MASS)
data(bacteria)

2. 模擬特定分佈的數據

R 提供了一系列可以用於數值模擬的函數。這些函數以 r 開頭,常用的有:rnorm( )、runif( )、rbinom( )和 rpois( ) 等。例如:

# 後續可視化部分會詳細介紹直方圖
r1 <- rnorm(n = 100, mean = 0, sd = 1)
# head(r1) # 取前 5 個值看看
hist(r1)

r2 <- runif(n = 10000, min = 0, max = 100)
hist(r2)

r3 <- rbinom(n = 80, size = 100, prob = 0.1)
hist(r3)

r4 <- rpois(n = 50, lambda = 1)
hist(r4)

3. 獲取其他格式的數據

3.1 txt 與csv 格式

如果數據來源是一個用 Windows 記事本或其他純文本編輯器所創建的 ASCII 格式文件,我們可以使用函數 read.table( ) 讀取其中的數據,返回的是一個數據框。

例如,假設創建的數據框 patients 的數據文件 patients.txt 存放於當前工作目錄下,我們可以使用下面的命令讀取該數據:

# getwd() # 獲取當前工作目錄
# 臨時創建下 patients.txt 數據文件
ID <- 1:5
sex <- c("male", "female", "male", "female", "male")
age <- c(25, 34, 38, 28, 52)
pain <- c(1, 3, 2, 2, 3)      
pain.f <- factor(pain, levels = 1:3, labels = c("mild", "medium", "severe"))   
patients <- data.frame(ID, sex, age, pain.f)
write.table(patients, "patients.txt", row.names = FALSE)

patients.data <- read.table("patients.txt", header = TRUE)
patients.data

在電子表格和數據庫應用中經常會生成帶分隔符的文本文件,其中 .csv 文件是用逗號分隔取值(Comma Separated Values)。函數 read.csv( ) 是函數 read.table( ) 的一個變體,專用於讀取 .csv 文件。

read.table ( )read.csv ( ) 兩個函數中參數的默認值是不同的。
在函數 read.table ( ) 中,參數 header 默認值為 FALSE,即認為文件第一行開始就是數據而非變量名。
而在函數 read.csv ( ) 中,參數 header 默認值為 TRUE。因此,在讀入數據前,建議先打開原始文件進行查看,然後設置恰當的參數正確地讀入數據。
write.csv(patients, "patients.csv", row.names=FALSE)
patients.data <- read.csv("patients.csv")
patients.data

3.2 xls 或 xlsx 格式

讀取電子表格數據有很多種方式,其中最簡單的方式是在 Excel 中將數據文件另存為一個逗號分隔(.csv)文件,然後用上述讀取.csv 文件的方法將其讀入R。還可以藉助第三方包(例如 openxlsx 包、readxl 包和 gdata 包)直接讀取 xlsx 或 xls 格式的數據文件

以 openxlsx 包為例:

library(openxlsx)
write.xlsx(patients, "patients.xlsx")
patients.data <- read.xlsx("patients.xlsx", sheet = 1)
patients.data

3.3 導入其他統計軟件的數據

有時我們需要讀取其他統計軟件產生的數據,如 SPSS、SAS、Stata、Minitab 等。一種方法是從其他統計軟件將數據輸出為文本文件,然後使用函數 read.table( ) 或 read.csv( ) 將數據讀入 R。另一種方法是藉助擴展包,比如 foreign 包,該包的主要功能就是讀寫其他統計軟件的數據。

下面以導入 SPSS 數據文件為例進行説明。

假設數據文件 patients.sav 存放於當前工作目錄下,我們可以使用下面的命令將該數據集讀入 R:

# 為了節約附件數量,讓我們直接從下載到工作區
URL <- "http://download.kesci.com/qlhatmok4/patients.sav"
download.file(URL, destfile = "./patients.sav", method="curl")

library(foreign)
# 函數 `read.spss( )` 中的參數 `to.data.frame` 默認為 FALSE,如果不設置為 TRUE,返回的將是一個列表形式數據。
patients.data <- read.spss("patients.sav" , to.data.frame = TRUE)
patients.data

用 foreign 包導入SAS、Stata 等軟件的數據文件的過程與上面類似,具體請查閲文檔。

4.數據錄入

在 R 中可以直接輸入數據,但是如果數據量較大(超過 10 列或超過 30 行),在 R 裏錄入數據並不是一個最佳選擇。我們可以選擇電子表格軟件錄入小規模的數據,比如 Excel。

但是如果數據量很大,使用電子表格軟件手工錄入數據的出錯概率也較大。這時,專門為數據錄入而設計的程序軟件更為合適,比如免費的軟件 EpiData。該軟件不僅可以方便地設置數據錄入的約束條件,比如範圍檢查、自動換行等,還可以對每個變量和變量值添加標籤。

foreign 包裏的函數 read.epiinfo( ) 可以直接讀取 EpiData 生成的 .rec 文件,但是建議先在 EpiData 中將錄入的數據導出為 Stata 數據文件,然後在 R 中使用函數 read.dta( ) 讀入數據。這樣做的好處是可以保留在 EpiData 中預設的變量的屬性,例如變量標籤和描述等。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.