R語言-如何讀取前n行數據
通常我們讀取文件時都會讀取全部的文件然後再進行操作,但是當讀取的數據量很大是讀取的時間會很長,而且占用RAM,對於寫測試代碼有點不方便。
所以隻讀取前n行數據是一個挺不錯的函數
##file:讀取文件路徑 ##n:讀取的前n行 ##header:是否有標題行 readfile<-function(file, n=1000, header=T){ pt <- file(file, "r") name <- NULL if(header){ name <- strsplit(readLines(pt, 1), split=',')[[1]]; #讀取標題 f1 <- readLines(pt, n) data <- read.table(text=f1, sep=',', col.names=name) }else{ data <- read.table(text=f1, sep=',') } close(pt) data }
測試,最近制作linux啟動盤誤將移動硬盤當U盤,要死要死的,近500G資料丟失,因為制成啟動盤所以資料還找不回來。
所以沒有大型數據做測試。
之前200M的文件本人電腦上讀取前10000行也是秒讀的。
(data <- readfile(file="mtcars.csv", n=5, header=T)) X.. X.mpg. X.cyl. X.disp. X.hp. X.drat. X.wt. 1 Mazda RX4 21.0 6 160 110 3.90 2.620 2 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 3 Datsun 710 22.8 4 108 93 3.85 2.320 4 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 class(data) [1] "data.frame"
補充:R語言(數據讀寫操作)
本節介紹一些實用的數據處理函數(如行、列合並),以及如何從各種數據源讀、寫數據。
實用函數
函數 | 含義 |
---|---|
length() | 對象的長度。如 2 行 3 列的矩陣,其長度為 6。 |
dim() | 對象的維度。如 2 3 表示對象是二維的,有 2 行 3 列。 |
str() | 對象的結構。常用於查看數據框各列的數據類型、或者因子的分級數量。 |
class() | 對象的類。比如矩陣的返回結果是 matrix。 |
typeof() | 對象內數據的類型。比如矩陣的返回結果是 integer。 |
mode() | 對象的模式。比如矩陣會返回 numeric。 |
names() | 對象中各成分的名稱。 |
cbind() | 按列合並多個對象。 |
rbind() | 按行合並多個對象。 |
objectname | 輸出對象。 |
head() | 輸出對象的前部,對於數據框而言是前6行。通過 head(obj, N) 來指定輸出前 N 行。 |
tail() | 類似地,輸出對象的後部。 |
ls(NULL) | 無參數函數。顯示當前所有對象的名稱列表。 |
rm() | 刪除單個或多個對象。使用 rm(list = ls()) 可以刪除除句點開頭的隱藏對象外的所有對象。 |
一個 ls() 函數的例子:
a <- matrix(1:6, nrow=2, ncol=3)ls() # 目前的對象隻有 a
‘a'
手動輸入
使用需要賦值的 edit() 函數,或者無需寫在賦值語句內的 fix() 函數。
dt <- data.frame(age = numeric(0), gender = character(0), weight = numeric(0))# dt <- edit(dt) # 需要自賦值# fix(dt) # 無需自賦值
遺憾的是,在 Jupyter Notebook 現行的版本中,尚且不支持 edit() 函數。不過用戶可以使用 fix() 函數。
讀取文件
關於怎樣讀取來自 URL 地址的網絡文件,R 可以實現,但這裡不做討論。以下隻討論本地數據源的讀寫。
分隔符文件
利用 read.table() 函數即可。其常用的參數有:
read.table(file, [header=T/F, sep=" ", row.names=, col.names=, na.strings=, colClasses=, quote=, skip=, stringAsFactors=T/F,])
其中,可選參數的含義大多較好理解:
header 表示文件首行是否是列名而不是數據;
sep 是列間分隔符;na.strings 指定一個字符向量,內部所有的元素在讀取時會被轉換為 NA;
colClasses 用於指派各列的類型,如 =c(“numeric”, “character”, “NULL”) 指定瞭前兩列的類型並跳過瞭第三列;
skip 用於跳過文件的最開始的若幹行;
stringAsFactors 為 TRUE(默認值)時表示字符向量按因子處理,設為 FALSE 可以提升大文本處理速度。
data.path <- paste(getwd(), '/data/iris.data.csv', sep='')dt <- read.table(data.path, header=T, sep=",")head(dt)
X5.1 | X3.5 | X1.4 | X0.2 | Iris.setosa |
---|---|---|---|---|
4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa |
4.6 | 3.4 | 1.4 | 0.3 | Iris-setosa |
# 利用 str() 函數查看其信息str(dt)
'data.frame': 149 obs. of 5 variables: $ X5.1 : num 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 5.4 ... $ X3.5 : num 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 ... $ X1.4 : num 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 ... $ X0.2 : num 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 0.2 ... $ Iris.setosa: Factor w/ 3 levels "Iris-setosa",..: 1 1 1 1 1 1 1 1 1 1 ...
須知:
如果列名中包含空格,R 會將空格替換為句點。
多數情況下,stringAsFactors 可以設為 FALSE。但是本例中的字符變量表示植物的種類,此處讀成因子是正確的。
函數 read.csv() 能夠讀取 csv 文件,但是功能不如 read.table() —— 後者能處理非 csv 文本。
處理 Excel 文件
讀取一個 Excel 文件最佳的方式,是預先將其轉為 csv 格式,並用上述的 read.table() 方法讀取。
你也可以查找關於 xlsx 包的相關內容,來獲知如何直接操作 xlsx 文件。此處略過不提。
可以看一下以前寫的文章:
統計軟件數據:SAS/SPSS/Stata
需要用到 foreign 包。
SAS:使用 read.ssd()。如果你安裝瞭 SAS,可以使用 Hmisc 包的 sas.get()。
SPSS:使用 read.spss(),或者 Hmisc 包的 spss.get()。
Stata:使用 read.data()。
數據庫
一個方法是使用 ODBC 接口。針對你的數據庫類型,安裝 ODBC 驅動;然後在 R 中安裝 RODBC 包。
另一個方法是使用 JDBC 接口,隻不過需要 RJDBC 包。
寫入文件
在我們對於數據進行清洗之後,往往需要把清洗結果輸出到一個新文件中。這裡就以 csv 格式為例吧。一個通常的 write.table()/write.csv() 的例子:
write.csv(dt, "filename.csv", row.names=F)
其中 row.names 指定為 FALSE,否則第一列會生成行號一樣的數據。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found