小格言

第一次使用R‎ > ‎

讀取資料

除了在R直接輸入資料外,匯入外部資料毋寧是較常見的做法。這裡介紹如何將辛苦蒐集來的資料匯入R,常用語法的包含:
  1. 函數

    read.csv()
           讀取csv資料

    read.table()
       讀取大多數的ASCII資料
    dim()                顯示資料檔或物件的變數與個案數
    names()           顯示資料檔中的變數名稱
    head()              顯示資料檔或物件的開頭
    ls()                     顯示目前作用中的資料框架/物件名稱
    rm()                  移除目前作用中的資料框架/物件

    作者已準備相關範例檔案customer.csvcustomer_head.txtcustomer_short.txt,可自行下載。相關範例也可以在範例檔中取得。
     
  2. 讀取外部資料

    R有許多方式可以讀取資料。由於目前問卷收集完成後,大部分都會將資料輸入在excel或記事本儲存成ASCII格式,因此read.table()與read.csv()是最常用的函數。
    我們首先介紹如何利用read.csv()將customer.csv匯入R。

    將工作資料夾以setwd()設定在c:/downloads/後,直接以read.csv()將csv匯入並指定給data。header=T表示csv第一列包含變數名稱,sep=","表示資料以逗號分隔。

    >data<-read.csv("c:/downloads/customer.csv", header=T, sep=",")

    匯入檔案後以dim()檢視data可以看見R已匯入100筆個案、18筆變數。

    >dim(data)
    [1] 100 18

    同樣的方法也適用於read.table()。再者裡我們準備了兩種不同的範例檔,我們先來看看兩個檔案的差異。首先customer_head.txt第一列有輸入變數名稱,且以分號分隔。

    "region";"gender";"age";"edcat";"jobcat";"employ";"income"

    1;1;20;3;1;0;31.00
    5;0;22;4;2;0;15.00
    3;1;67;2;2;16;35.00
    4;0;23;3;2;0;20.00
    2;0;26;3;2;1;23.00
    4;0;64;4;3;22;107.00
    2;1;52;2;1;10;77.00
    3;1;44;3;1;11;97.00
    2;1;66;2;1;15;16.00
    2;0;47;1;6;19;84.00

    customer_short.txt內容完全與上述customer_head.txt相同,唯一差異在short這個檔案並沒有輸入變數名稱。

    1;1;20;3;1;0;31.00

    5;0;22;4;2;0;15.00
    3;1;67;2;2;16;35.00
    4;0;23;3;2;0;20.00
    2;0;26;3;2;1;23.00
    4;0;64;4;3;22;107.00
    2;1;52;2;1;10;77.00
    3;1;44;3;1;11;97.00
    2;1;66;2;1;15;16.00
    2;0;47;1;6;19;84.00

    現在來看看如何匯入customer_head.txt。我們以read.table()為例,建立data1資料,以head=T告訴R此資料第一列包含變數名稱,sep=";"表示資料以分號分隔。這裡可以發現,sep的屬性不一定是逗號,而是根據資料裡的分隔符號來決定。
    資料匯入後,除dim()以外,可以names()來檢視變數名稱。

  3. >data1<-read.table("c:/downloads/customer_head.txt", header=T, sep=";")
    >names(data1)
    [1] "region" "gender" "age"    "edcat"  "jobcat" "employ" "income"
    >dim(data1)
    [1] 10  7

    我們以同樣的方法匯入customer_short.txt。這次我們建立data2,並注意這是不具變數名稱的資料檔,因此header=F。匯入後以head(data2)來檢視data2的開頭。

    >data2<-read.table("c:/downloads/customer_short.txt", header=F, sep=";")
    > head(data2)
      V1 V2 V3 V4 V5 V6  V7
    1   1    1   20  3   1   0    31
    2   5   0   22  4   2   0    15
    3   3   1   67  2    2  16   35
    4   4   0   23  3   2   0    20
    5   2   0   26  3   2   1     23
    6   4   0   64  4   3  22   107

    我們可以發現R已經自動將變數名稱命名為V1-V7。那們要如何重新命名變數呢?我們可以用names()與c()來完成此工作。先以names(data2)指定要命名的資料是data2,再以c()命名變數。

    > names(data2)<-c("region","gender","age","edcat","jobcat","employ","income")

    以head()再次檢視data2可發現變數名稱已重新命名完成。

    > head(data2)
      region gender age edcat jobcat employ income
    1        1           1     20       3         1          0         31
    2        5          0     22       4         2          0         15
    3        3          1      67       2         2        16         35
    4        4          0     23       3         2          0         20
    5        2          0     26       3         2          1          23
    6        4          0     64       4         3        22       107

    除dim()、names()與head()可檢視資料外,我們也可以直接輸入物件名稱來檢視全部資料。

    > data2
       region gender age edcat jobcat employ income
    1         1          1     20       3          1          0         31
    2         5         0     22       4          2          0         15
    3         3         1      67       2          2        16         35
    4         4         0     23       3          2          0         20
    5         2         0     26       3          2          1         23
    6         4         0     64       4          3        22       107
    7         2         1      52       2          1        10         77
    8         3         1      44       3          1        11         97
    9         2         1      66       2          1        15         16
    10       2        0      47       1          6        19         84


  4. 顯示/移除物件

    在讀取資料的過程中我們創造了三個資料框架(data frame),分別是data、data1與data2。這三個資料框架都已儲存於記憶體中,可單獨呼叫、存取與分析。如果確定已無需使用則可刪除。我們以ls()來顯示目前儲存於記憶體中的資料框架與物件,以rm()來移除物件。

    >ls()
    [1] "data" "data1" "data2"
    >ls(data1)
    [1] "age"    "edcat"  "employ" "gender" "income" "jobcat" "region"
    >rm(data)
    >ls()
    [1] "data1" "data2"