這篇文章主要討論如何從URL中獲取數(shù)據(jù)。為什么需要從URL中獲取數(shù)據(jù)?
- 你想和不熟悉R的人分享你的代碼,以及你想避免解釋如何在文件開(kāi)頭改變文件的路徑等問(wèn)題。
- URL中的數(shù)據(jù)一直更新,你想實(shí)時(shí)處理最新的數(shù)據(jù)。
- 你希望你的代碼在另一臺(tái)機(jī)器以及另一個(gè)目錄下工作。
- 你想在博客中發(fā)布一個(gè)完整的可重復(fù)的分析實(shí)驗(yàn),你不想在文中出現(xiàn)”請(qǐng)到www.xxxx.com,下載數(shù)據(jù)并加載到R中”。
不管你的原因是什么,都是很棒的想法。下面是一些從URL中獲取數(shù)據(jù)的一些代碼,希望能幫到一些人。
說(shuō)明?。?!
這里僅僅處理表格形式的數(shù)據(jù),并不是從網(wǎng)絡(luò)中爬取數(shù)據(jù)。這是最簡(jiǎn)單的一種情況:在URL中儲(chǔ)存著一個(gè)txt或csv文件,你希望直接讀取數(shù)據(jù),而不是先下載到本地,然后再讀進(jìn)R中。
使用data.table::fread()
我喜歡data.table包。幾乎每個(gè)項(xiàng)目中,我都會(huì)使用它。它是R中data.frame對(duì)象的擴(kuò)展,但是在性能上有很大的提升。其中一個(gè)改進(jìn)點(diǎn)就是fread()函數(shù)。它類似于base包中的read.csv()和read.table()函數(shù)。fread()在很多地方做了改善,但是這里我們僅僅使用它來(lái)讀取URL中的數(shù)據(jù)。使用fread()在本地讀取數(shù)據(jù)的格式如下:
library(data.table)
mydat <- fread('C://Some/File/Path.csv')
從網(wǎng)絡(luò)源中讀取數(shù)據(jù)和這沒(méi)有什么區(qū)別。在help文件(?fread)中作者提供的樣例為:
library(data.table)
mydat <- fread('http://www.stats.ox.ac.uk/pub/datasets/csb/ch11b.dat')
head(mydat)
V1 V2 V3 V4 V5
1: 1 307 930 36.58 0
2: 2 307 940 36.73 0
3: 3 307 950 36.93 0
4: 4 307 1000 37.15 0
5: 5 307 1010 37.23 0
6: 6 307 1020 37.24 0
如果你在瀏覽器中訪問(wèn)上面的鏈接,會(huì)彈出下載的窗口。如果你訪問(wèn)上級(jí)地址http://www.stats.ox.ac.uk/pub/datasets/csb,你會(huì)發(fā)現(xiàn)很多的數(shù)據(jù)下載鏈接。通過(guò)fread()我們可以直接讀取數(shù)據(jù)到R中,而不用點(diǎn)擊下載鏈接進(jìn)行下載。
使用RStudio
在RStudio中,通過(guò)點(diǎn)擊Tools -> Import Dataset -> From Web URL,然后填寫URL地址。
使用RCurl::getURL()
library(RCurl)
myfile <- getURL('https://sakai.unc.edu/access/content/group/3d1eb92e-7848-4f55-90c3-7c72a54e7e43/public/data/bycatch.csv', ssl.verifyhost=FALSE, ssl.verifypeer=FALSE)
getURL()抓取指定URL中的內(nèi)容,并不返回data.frame對(duì)象。它僅僅把URL中的內(nèi)容儲(chǔ)存到字符串中。
class(myfile)
[1] "character"
所以,我們?cè)趺传@取data.frame對(duì)象呢?我們可以使用textConnection()函數(shù)打開(kāi)字符串中的鏈接,就像打開(kāi)本地硬盤中的文件一樣。接著使用read.csv()函數(shù)(你也可以使用read.table()或fread()函數(shù))讀取字符串對(duì)象并創(chuàng)建data.frame對(duì)象。
mydat <- read.csv(textConnection(myfile), header=T)
head(mydat)
Season Area Gear.Type Time Tows Bycatch
1 1989-90 North Bottom Day 48 0
2 1989-90 North Bottom Night 6 0
3 1989-90 North Mid-Water Night 1 0
4 1989-90 South Bottom Day 139 0
5 1989-90 South Mid-Water Day 6 0
6 1989-90 South Bottom Night 6 0
現(xiàn)在,URL中的數(shù)據(jù)已成功轉(zhuǎn)換為R中data.frame對(duì)象。