用R獲取數據

R作爲一個開放的系統,它與其他應用軟件,尤其是數據處理軟件,比如Excel,SPSS等有着密切的資源共享性,相互之間進行數據調用非常方便。下面就常見的幾種讀取數據的方法進行分類描述,內容持續更新。。。


我們在每次開始用R進行工作前,可以先考慮使用setwd()函數設定常用工作路徑,以省去之後可能需要的多次指定文件獲取、修改、保存路徑的操作,或者在每次讀取時設置路徑都可以。


1.讀取.csv文件

csv是逗號分隔值文件格式,csv(逗號分隔值)是一種用來存儲數據的純文本文件,通常都是用於存放電子表格或數據的一種文件格式。

本例中用到的數據集是來自於R下MASS包中的Insurance.csv文件。文件位置一般在包的安裝目錄下的data文件夾下。例如下圖是我電腦中的Insurance.csv文件存放位置。



> setwd("D://R包//MASS//data")                 #設置默認路徑
> write.csv(Insurance,"Insurance.csv")         #將Insurance數據集以csv格式存入指定路徑
> Insur=read.csv("Insurance.csv")              #使用read.csv()函數直接讀取
> head(Insur)                                   #查看讀取到的部分數據
  X District  Group   Age Holders Claims
1 1        1    <1l   <25     197     38
2 2        1    <1l 25-29     264     35
3 3        1    <1l 30-35     246     20
4 4        1    <1l   >35    1680    156
5 5        1 1-1.5l   <25     284     63
6 6        1 1-1.5l 25-29     536     84
> 



也可使用read.table()函數讀取數據

> Insur_1=read.table("Insurance.csv")      #<span style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Tahoma, Simsun; font-size: 15px; line-height: 27px;">使用read.table()函數讀取數據</span>
> head(Insur_1)                            #查看讀取到的部分數據
  V1                                           V2
1 NA ,"District","Group","Age","Holders","Claims"
2  1                      ,"1","<1l","<25",197,38
3  2                    ,"1","<1l","25-29",264,35
4  3                    ,"1","<1l","30-35",246,20
5  4                    ,"1","<1l",">35",1680,156
6  5                   ,"1","1-1.5l","<25",284,63
> 
可以看出,用專門讀取CSV格式的函數read.csv()與一般的讀取數據函數read.table()是不同的,這是因爲兩函數中控制參數的默認值不同。如果想用read.table()函數輸出read.csv()函數那樣的格式,可以在read.table()設置參數.具體步驟如下

> Insur_2=read.table("Insurance.csv",header=TRUE,sep=",")    #更改函數設置
> head(Insur_2)
  X District  Group   Age Holders Claims
1 1        1    <1l   <25     197     38
2 2        1    <1l 25-29     264     35
3 3        1    <1l 30-35     246     20
4 4        1    <1l   >35    1680    156
5 5        1 1-1.5l   <25     284     63
6 6        1 1-1.5l 25-29     536     84
> 

2:讀取.sav文件

讀取.sav文件,我們可以用foregin加載包中的read.spss()函數來讀取文件,可是中間過程遇到了“ position 0: Variable name begins with invalid character”,百度了一下問題所在,說是問題出在spss文件的變量名命名規則與R中的不同,出現了R中非法字符,但我把名稱修改了之後依舊是這個錯誤。很無奈。所幸在搜索的過程中又找到了一個新的方法。留個解決方法吧,方便以後遇到這個問題的童鞋查找。
foreign包和Hmisc包的讀取sav文件的函數兼容性不太好,可以使用memisc包中的方法搞定:

install.packages("memisc")  # 安裝memisc包(支持中文命名)
library(memisc)
setwd(".sav路徑")
data0 = as.data.set(spss.system.file("你的spss文件名.sav"))
data = as.data.frame(data0)  # data即爲所要的數據

3.讀取.xls文件

從Excel直接獲取數據最好的方式是將其轉化爲.csv格式,再用讀取csv格式文件的方法獲取數據。但在Windows系統中我們也可以選擇使用RODBC軟件包中的相關函數來實現。本次用到的.xls文件內容如下:


首先加載RODBC軟件包,本地沒有的可以先去下載,下載完成後再輸入下面這句話,完成加載

> library(RODBC) 
> ch=odbcConnectExcel(file.choose()) #輸入這句話後會顯示出一個選擇窗口,直接點擊你需要讀取的.xls文件即可。(注意:odbcConnectExcel()只能在32bit上的電腦操作系統上使用)
> ch                                                              #顯示連接信息
RODBC Connection 1
Details:
  case=nochange
  DBQ=D:\R包\stata.xls
  DefaultDir=D:\R包
  Driver={Microsoft Excel Driver (*.xls)}
  DriverId=790
  MaxBufferSize=2048
  PageTimeout=5
> sqlTables(ch)                                         #顯示出從ODBC中連接到的表格
       TABLE_CAT TABLE_SCHEM TABLE_NAME   TABLE_TYPE REMARKS
1 D:\\R包\\stata        <NA>    Sheet1$ SYSTEM TABLE    <NA>
2 D:\\R包\\stata        <NA>    Sheet2$ SYSTEM TABLE    <NA>
3 D:\\R包\\stata        <NA>    Sheet3$ SYSTEM TABLE    <NA>
> Insur=sqlFetch(ch,"Sheet1")                    #讀取表格中的Sheet1(也可根據自己的需求打開),並儲存與Insur
> odbcClose(ch)                                              #關閉連接
> head(Insur)                                                    #讀取Insur中的前若干條數據,或者直接用> Insur讀取全部數據
     時間 房價指數 建材價格指數
1 2000-q1    100.7         98.0
2 2000-q2    101.1         98.2
3 2000-q3    101.5         98.4
4 2000-q4    101.2         98.6
5 2001-q1    101.9         99.9
6 2001-q2    102.5         99.9
> 


在Mac  OS或Linux,則可以使用gdata加載包中的read.xls()函數來讀取Excel數據,本文不做論述。


4.讀取txt文件

TXT是最常見的文本格式,在儲存數據時以製表符(即Tab)爲分割符,我們同樣可以使用read.table()和read.csv()函數對該格式進行讀取

本例中用到的文本文件見下圖

> setwd("D://R包")
> Insur_txt=read.table("stata.txt")            #使用read.table()函數直接讀取
> head(Insur_txt)
       V1    V2   V3
1 2000-q1 100.7 98.0
2 2000-q2 101.1 98.2
3 2000-q3 101.5 98.4
4 2000-q4 101.2 98.6
5 2001-q1 101.9 99.9
6 2001-q2 102.5 99.9
> > Insur_txt1=read.csv("stata.txt",header=TRUE,sep="") #使用read.csv()函數
> head(Insur_txt1)
  X2000.q1 X100.7   X98
1  2000-q2  101.1  98.2
2  2000-q3  101.5  98.4
3  2000-q4  101.2  98.6
4  2001-q1  101.9  99.9
5  2001-q2  102.5  99.9
6  2001-q3  102.7 100.1
> 


綜上所述,read.csv()函數和read.table()函數差別所在之處,在於讀取以其他固定分隔符來作爲數據間隔的文件。

5.獲取網頁數據

下面我們使用XML軟件包中的readHTMLTable()函數來讀取網頁數據,我們以獲取和訊網中萬科股票的相關金融數據爲例,數據所在地址:點擊打開鏈接


> install.packages(XML)
<span style="font-family: Arial, Helvetica, sans-serif;">>library(XML)                                                                                                                                                                                #安裝並加載XML包</span>
> u1="http://stockdata.stock.hexun.com/2008en/zxcwzb.aspx?stockid=000002&type=0&adate=2013.06.30"   #將待讀取的頁面網址存入變量u1
> table1=readHTMLTable(u1)                                                                          #將數據讀取結果存入到變量table1
> names(table1)                                                                                      #顯示table1各維度名稱
[1] "NULL" "NULL" "NULL" "NULL"
> table1[[2]]                                                                                       #讀取table1第2維度中的內容
                                      Period End Date       June 30 2016
1                                   Operating  Income  74,795,294,306.29
2                                          Net Profit   5,351,309,986.08
3                                        Total Profit   9,980,342,845.59
4            Net Profit Excluding Extraordinary Items   5,335,845,153.10
5                                        Total Assets 712,306,691,248.75
6                                Shareholders' Equity  97,460,727,287.97
7            Net Cash Flows From Operating Activities  25,797,213,427.97
8                            Basic Earnings Per Share               0.48
9                        The Rate Of Return On Equity               5.49
10 Net Cash Flows From Operating Activities Per Share               2.34
11                         Net Assets Value Per Share               8.83
12                Net Assets Per Share After Adjusted               0.00
13   Foreign Financial Accounting Standard Net Profit               0.00
14                  EPS Excluding Extraordinary Items               0.48
15                                  Report Start Time         2016-01-01
16                                    Report End Time         2016-06-30
        March 31 2016
1   14,611,312,019.58
2      833,232,885.76
3    1,687,268,595.75
4      805,115,190.87
5  658,837,478,395.54
6  100,636,736,796.09
7  -10,726,129,132.78
8                0.08
9                0.83
10              -0.97
11               9.12
12               0.00
13               0.00
14               0.07
15         2016-01-01
16         2016-03-31
> 


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