R中如何讀取資料

2021-07-02 12:31:34 字數 4799 閱讀 3407

對於在檔案讀取和寫入的工作,r使用工作目錄來完成。可以使用命

令getwd() (獲得工作目錄)來找到目錄,使用命令setwd("c:/data") 或

者setwd("/home/paradis/r") 來改變目錄。如果乙個檔案不在工作目錄裡

則必須給出它的路徑8。

r可以用下面的函式讀取儲存在文字檔案(ascii)中的資料:read.table

(其中有若干引數,見後文),scan和read.fwf。r也可以讀取以其他格式的

檔案(excel, sas, spss, . . . ) 和訪問sql型別的資料庫,但是基礎包中並不

包含所需的這些函式。這些功能函式對於r的高階應用是十分有用的,但是我

們在這裡將讀取檔案限定在ascii格式。

函式read.table用來建立乙個資料框,所以它是讀取**形式的資料的

主要方法。舉例來說,對於乙個名為data.dat的檔案,命令:

> mydata <- read.table("data.dat")

將建立乙個資料框名為mydata,資料框中每個變數也都將被命名,

預設值為v1, v2, . . . 並且可以單獨地訪問每個變數,

**為:mydata$v1,mydata$v2, . . . , 或者用mydata["v1"], mydata["v2"], . . . ,

或者還有一種方法,mydata[, 1], mydata[,2 ], . . . 9 這裡有一些選項的預設值(即如果使用者不設定那麼r將自動使用的值)見於下表:

read.table(file, header = false, sep = "", quote = "\"'", dec = ".",row.names, col.names, as.is = false, na.strings = "na",colclasses = na, nrows = -1,skip = 0, check.names = true, fill=! blank.lines.skip,strip.white = false, blank.lines.skip = true,comment.char = "#")

file 檔名(包在""內,或使用乙個字元型變數),可能需要全路徑(注意即使是在windows下,符號n 也不允許包含在內,必須用/替

換),或者乙個url鏈結(http://...)(用url對檔案遠端訪問)

header 乙個邏輯值(false or true),用來反映這個檔案的第一行是否包含

變數名sep 檔案中的字段分離符,例如對用製表符分隔的檔案使用sep="nt"

quote 指定用於包圍字元型資料的字元

dec 用來表示小數點的字元

row.names 儲存著行名的向量,或檔案中乙個變數的序號或名字,預設時行號取

為1, 2, 3, . . .

col.names 指定列名的字元型向量(預設值是:v1, v2, v3, . . . )

as.is 控制是否將字元型變數轉化為因子型變數(如果值為false),或者仍

將其保留為字元型(true)。as.is可以是邏輯型,數值型或者字元

型向量,用來判斷變數是否被保留為字元。

na.strings 代表缺失資料的值(轉化為na)

colclasses 指定各列的資料型別的乙個字元型向量

nrows 可以讀取的最大行數(忽略負值)

skip 在讀取資料前跳過的行數

check.names 如果為true,則檢查變數名是否在r中有效

fill 如果為true且非所有的行中變數數目相同,則用空白填補

strip.white 在sep已指定的情況下,如果為true,則刪除字元型變數前後多餘的

空格blank.lines.skip 如果為true,忽略空白行

comment.char 乙個字元用來在資料檔案中寫注釋,以這個字元開頭的行將被忽略

(要禁用這個引數,可使用comment.char = "")

read.table的幾個變種因為使用了不同的預設值可以用在幾種不同情況

下:read.csv(file, header = true, sep = ",", quote="\"", dec=".",

fill = true, ...)

read.csv2(file, header = true, sep = ";", quote="\"", dec=",",

fill = true, ...)

read.delim(file, header = true, sep = "\t", quote="\"", dec=".",

fill = true, ...)

read.delim2(file, header = true, sep = "\t", quote="\"", dec=",",

fill = true, ...)

函式scan比read.table要更加靈活,它們的區別之一是前者可以指定變

量的型別,例如:

> mydata <- scan("data.dat", what = list("", 0, 0))

讀取了檔案data.dat中三個變數,第乙個是字元型變數,後兩個是數值

型變數。另乙個重要的區別在於scan()可以用來建立不同的物件,向量,矩

陣,資料框,列表. . . 在上面的例子中,mydata是乙個有三個向量的列表。

在預設情況下,也就是說,如果what被省略,scan()將建立乙個數值型向

量。如果讀取的資料型別與預設型別或指定型別不符,則將返回乙個錯誤信

息。這些選項在下面進行說明。

scan(file = "", what = double(0), nmax = -1, n = -1, sep = "",

quote = if (sep=="\n") "" else "'\"", dec = ".",

skip = 0, nlines = 0, na.strings = "na",

flush = false, fill = false, strip.white = false, quiet = false,

blank.lines.skip = true, multi.line = true, comment.char = "")

file 檔名(在""之內), 可能包含它的路徑(符號n 不允許使用,必須用/替代, 即使是在windows下面) ,或者使用乙個url鏈結(http://...);如果¯le="",資料從鍵盤輸入(使用乙個空白行終止輸入)

what 指定資料的型別(預設值為數值型)

nmax 要讀取資料的最大數量,如果what是乙個列表,nmax則是可以讀取

的行數(在預設情況下,scan讀取到檔案最末端為止的所有資料)

n 要讀取資料的最大數量(在預設情況下,沒有限制)

sep 檔案中的字段分隔符

quote 用來包圍字元型值

dec 用來表示小數點的字元

skip 在讀取資料前跳過的行數

nlines 要讀取的行數

na.string 表示缺失資料的字串**化為為na)

flush 乙個邏輯值,如果為true,當讀取完指定列數後scan將轉到下一行(這樣就允許使用者在資料檔案中新增注釋,即新增在指定列數之後)

fill 如果為true,且非所有的行中變數數目相同,則用空白填補

strip.white 在sep已指定的情況下,如果為true,則刪除字元型變數前後多餘的空格

quiet 乙個邏輯值,如果為false,scan顯示一行資訊說明哪些欄位被讀取

blank.lines.skip 如果為true,忽略空白行

multi.line 當what是乙個列表時,若為false則表示列表中每個個體的所有變數都在同一行中

comment.char 指定注釋開始字元,一行中以這個字元開頭的部分將被忽略(缺是禁用此選項)

函式read.fwf可以用來讀取檔案中一些固定寬度格式的資料:

read.fwf(file, widths, sep="\t", as.is = false,skip = 0, row.names, col.names, n = -1, ...)

除了widths用來說明讀取欄位的寬度外,選項與read.table()基本相同。舉例來說,如果在乙個名為data.txt的檔案中有一組如右所示的資料,可以讀取這些資料用下面的命令:

a1.501.2

a1.551.3

b1.601.4

b1.651.5

c1.701.6

c1.751.7

> mydata <- read.fwf("data.txt", widths=c(1, 4, 3))

> mydata

v1 v2 v3

1 a 1.50 1.2

2 a 1.55 1.3

3 b 1.60 1.4

4 b 1.65 1.5

5 c 1.70 1.6

6 c 1.75 1.7

這是這兩天的專案中碰到的兩個小問題,記錄一下。

第乙個問題:在做資料分析時,經常會碰到一些欄位是以0開頭的數字,在使用函式read.table或者read.csv等讀取檔案時,總是把這些字段認為是數值型的,自動的將開頭的0去掉。如何解決這個問題呢?

可以通過設定read.table或者read.csv的引數colclasses="character"來實現。

第二個問題:使用函式read.table讀取檔案時,如果遇到檔案中某些行的資料不規則,會出現這樣的錯誤:scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :   19行沒有4元素。如果希望忽略掉這樣的錯誤,直接讀取,如何解決?

可以通過設定read.table的引數

fill

=true

實現。

rstudio中讀取資料 R語言讀取外部資料檔案

使用r語言的時候,如果是少量資料,不妨使用c 或其他函式進行建立 但是對於大量資料,最好還是先通過其他更方便的軟體建立資料檔案,然後使用r讀入這個檔案。前文說,csv是非常好的資料檔案格式,跨平台支援非常好。我在excel或者spss中建立的資料,只要存為csv格式,就可以使用幾乎任何資料處理軟體對...

R 讀取Excel資料

最簡單的是採用前兩種方式。1.將excel資料另存為csv格式,用read.csv 檔名 2.將excel資料另存為txt格式,用read.table 檔名 3.在windows系統中可以選擇使用rodbc軟體包中的相關函式來實現。library rodbc 載入rodbc軟體包 channel o...

R語言sqldf包讀取資料亂碼如何解決

我用sql語句選擇一列資料,最後檢視該列資料的時候,發現資料亂碼了。解決辦法如下 data1 str data1 colnames data1 head data1 處理前 處理後 transform data,變數1 iconv 變數1,utf 8 gbk 方法一 同理,將資料庫讀取的資料物件進行...