20200513·Kony·win10
1. 數(shù)據(jù)的導(dǎo)入
1.1 導(dǎo)入csv文件
此方法可以用以導(dǎo)入Excel數(shù)據(jù),將Excel數(shù)據(jù)轉(zhuǎn)化為csv格式。 CSV是(逗號(hào)分隔值)的英文縮寫,通常都是純文本文件。
其導(dǎo)入R中的數(shù)據(jù)格式為:
mydataframe<-read.table(file, header=logical_value, sep="delimiter", row.names="name")
file:csv文件
header:邏輯值,首先是否包括變量名
sep:分隔符 "delimiter"
row.names:指定一個(gè)或多個(gè)表示行標(biāo)識(shí)符的變量
grades<-read.table("studentgrades.csv",header=TRUE,sep=",",row.names="STUDENTID")
#表示從當(dāng)前目錄中讀取一個(gè)名為studentgrades.csv的逗號(hào)分隔文件
#從文件的第一行取得變量名字,將STUDENTID指定為行標(biāo)識(shí)符
#整個(gè)結(jié)果保存到grades的數(shù)據(jù)框中。
另外一個(gè)導(dǎo)入csv文件的函數(shù)是read.csv()
read.delim和read.delim2分別使用句號(hào)和逗號(hào)作為小數(shù)位來導(dǎo)入制表符分隔的文件
1.2 導(dǎo)入剪切板中的數(shù)據(jù)
通常情況下就是在Excel中復(fù)制,接著輸入以下命令就可以導(dǎo)入數(shù)據(jù)。
data <- read.table("clipboard", header = T, sep="\t")
1.3 導(dǎo)入文本文件
一般采用read.table()函數(shù)和read.csv()函數(shù)實(shí)現(xiàn)文本文件數(shù)據(jù)的讀取,對(duì)于這兩個(gè)函數(shù)有幾個(gè)重要的參數(shù):
- file:指定外部文件的路徑和文件名;
- header:指定是否將原數(shù)據(jù)的第一行最為字段名,read.table()函數(shù)默認(rèn)設(shè)置為FALSE,而read.csv()函數(shù)默認(rèn)設(shè)置為TRUE;
- sep:指定字段之間的分割符,read.table()函數(shù)默認(rèn)設(shè)置為空格“”,而read.csv()函數(shù)默認(rèn)設(shè)置為逗號(hào);
- 除此,read.table()函數(shù)還可以設(shè)置讀入數(shù)據(jù)集的行名、列名、字符串是否轉(zhuǎn)換為因子、缺失值的形式等,詳細(xì)可查看read.table()函數(shù)的幫助文檔。
1.4 從scan()導(dǎo)入數(shù)據(jù)
scan()主要用于鍵盤輸入數(shù)據(jù),詳細(xì)使用方法:
scan(file = "", what = double(0), nmax = -1, n = -1, sep = "",
quote = if(identical(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 = "", allowEscapes = FALSE, encoding = "unknown")
參數(shù)使用如下所示:
- what:聲明讀入為字符類型數(shù)據(jù),可能指定讀入的精度/類型,例如:what=integer(0);what=numeric(0);what=character(0); 如果SCAN()讀入有字符與數(shù)字,用what=“”來進(jìn)行聲明,則會(huì)把讀入的數(shù)字隱式的都轉(zhuǎn)變成字符;
-
sep:指定各個(gè)讀入的數(shù)據(jù)之間的分隔符;默認(rèn)情況下分隔符:空格、tab;如果不是其它分隔符,例如“:/”通過SEP來指定;
可以通過list指定讀入變量的變量名,同時(shí)生成的對(duì)象為列表,則可以同時(shí)讀入字符與數(shù)字; - Skip: 從第幾行開始讀入數(shù)據(jù);
-
Nlines:指定最大讀入行數(shù);
如果通過鍵盤輸入的時(shí)候,不希望出現(xiàn)下標(biāo)提示,則可以使用:quiet=TRUE;
encoding =””指定的編碼格式,有時(shí)候讀入的中文可能會(huì)出現(xiàn)亂碼的時(shí)候,可能通過這個(gè)參數(shù)來指定:Latin-1 或者 UTF-8
1.5 使用表格輸入數(shù)據(jù)
mydata<-data.frame(age=numeric(0),
gender=character(0),
weight=numeric(0))
mydata<-edit(mydata)
## 創(chuàng)建一個(gè)名為mydata的數(shù)據(jù)框,含三個(gè)變量,age為數(shù)據(jù)型,gender為字符型,weight為數(shù)值型。
## edit調(diào)用文本編輯器,鍵入數(shù)據(jù)。
## 其中numeric(0)創(chuàng)建一個(gè)指定模型但不含實(shí)際數(shù)據(jù)的變量。
## 如果再次調(diào)用mydata<-edit(mydata)能夠用來修改數(shù)據(jù),或者使用fix(mydata)也行。
1.6 使用readxl包來讀取excel文件
readxl包中的幾個(gè)函數(shù)可以讀取excel文件,主要有read_excel,read_xls,read_xlsx。其中各個(gè)函數(shù)的參數(shù)如下所示:
read_excel(path, sheet = NULL, range = NULL, col_names = TRUE,
col_types = NULL, na = "", trim_ws = TRUE, skip = 0,
n_max = Inf, guess_max = min(1000, n_max),
progress = readxl_progress(), .name_repair = "unique")
read_xls(path, sheet = NULL, range = NULL, col_names = TRUE,
col_types = NULL, na = "", trim_ws = TRUE, skip = 0,
n_max = Inf, guess_max = min(1000, n_max),
progress = readxl_progress(), .name_repair = "unique")
read_xlsx(path, sheet = NULL, range = NULL, col_names = TRUE,
col_types = NULL, na = "", trim_ws = TRUE, skip = 0,
n_max = Inf, guess_max = min(1000, n_max),
progress = readxl_progress(), .name_repair = "unique")
參數(shù)意義:
- path:xls/xlsx文件的路徑
- sheet:Excel文件中Sheet的參數(shù),可以是一個(gè)字符串,也就是sheet的名稱,可以是一個(gè)整數(shù),它表示sheet的位置。如果不輸入這個(gè)參數(shù),默認(rèn)輸入第1個(gè)sheet的數(shù)據(jù)。
- range:sheet中單元格的范圍,例如可以輸入range=B2:G14。也可以指定某個(gè)sheet,例如range="mtcars!B1:D5"
- co_lnames: TRUE 使用第一行作為行名, FALSE 使用默認(rèn)的名字,或者是使用一個(gè)字符串或字符串向量來表示第一行的名稱
其余參數(shù)參考readxl資料。
1.7 批量讀取數(shù)據(jù)
讀取N個(gè)Excel文件,并將這N個(gè)Excel文件進(jìn)行合并,分為四種情況,代碼如下所示,其中read_excel函數(shù)所在的包為readxl。
解決方案如下所示:
setwd('D:\\data file\\data1')
# 設(shè)置R的工作空間
#res <- NULL
data1 <- data.frame()
# 初始化數(shù)據(jù)框,用于后面的數(shù)據(jù)合并
#通過循環(huán)完成數(shù)據(jù)合并
for (i in 1:4){
path <- paste0(getwd(),'\\','test',i,'.xlsx') # 構(gòu)造數(shù)據(jù)路徑
res <- c(res,path)
data1 <- rbind(data1,read_excel(path = path)) # 讀取并合并數(shù)據(jù)
對(duì)于文件沒有規(guī)律的情況,如下所示:
setwd('D:\\data file\\data2') # 設(shè)置工作空間
filenames <- dir() # 讀取該工作空間下的所有文件名
data2 <- data.frame() # 初始化數(shù)據(jù)框,用于后面的數(shù)據(jù)合并
#通過循環(huán)完成數(shù)據(jù)合并
for (i in filenames){
# 構(gòu)造數(shù)據(jù)路徑
path <- paste0(getwd(),'\\',i)
#res <- c(res,path)
# 讀取并合并數(shù)據(jù)
data2 <- rbind(data2,read_excel(path = path))
對(duì)于文件名沒有規(guī)律的情況,并且只讀取某做后綴的文件,如下所示:
# 加載第三方擴(kuò)展包,用于編寫SQL語句
library(sqldf)
# 設(shè)置工作空間
setwd('D:\\data file\\data4')
# 讀取該工作空間下的所有文件名
filenames <- dir()
# 通過正則,獲取所有xlsx結(jié)尾的文件名
filenames2 <- grep('\\.xlsx', filenames, value = TRUE)
# 初始化數(shù)據(jù)框,用于后面的數(shù)據(jù)合并
data4 <- data.frame()
#通過循環(huán)完成數(shù)據(jù)合并
for (i in filenames2){
# 構(gòu)造數(shù)據(jù)路徑
path <- paste0(getwd(),'\\',i)
#res <- c(res,path)
# 使用read_excel函數(shù)讀取xlsx文件
data <- read_excel(path = path)
# 使用sqldf函數(shù)編寫SQL語句,并把結(jié)果合并起來
data4 <- rbind(data4, sqldf("select id,name,gender,age from data"))
2. 導(dǎo)出數(shù)據(jù)
2.1 導(dǎo)出的路徑
為了避免在導(dǎo)出路徑中使用轉(zhuǎn)義字符,可以使用file.path()函數(shù)來構(gòu)建正確的路徑,這個(gè)函數(shù)的工作原理類似于paste(),如下所示:
file.path("d:","download")
[1] "d:/download"
2.2 導(dǎo)出未txt格式
a
[1] 1 2 4 NA 5 4
b
[1] "a" "b" "c" "d" NA "4"
c <- data.frame(a,b)
c
a b
1 1 a
2 2 b
3 4 c
4 NA d
5 5 <NA>
6 4 4
write.table(c,file = "c:\\data.txt",sep = ",",quote = FALSE, append = FALSE, na = "NA")
2.3 讀取錯(cuò)誤
R語言讀取Excel文件有時(shí)會(huì)出錯(cuò),如果要讀取某些Excel表格文件,操作如下所示:
用鼠標(biāo)選中數(shù)據(jù),然后Ctrl+C復(fù)制;
在Rstudio中輸入:read.table(“clipboard”,header=T)->x1,顯示以下結(jié)果:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : line 2 did not have 8 elements
大概意思是,有兩行數(shù)據(jù)的元素不滿足8個(gè)(即第No.2不滿足8個(gè)元素),無法讀取,因此需要改變一下代碼,如下所示:
x <- read.table("clipboard",sep="\t",header=T)
這樣就能正常讀取了,因?yàn)镋xcel的文件中,每個(gè)單元格就是以制表符將它們分開的,而sep=“\t”的意思就是,讀取數(shù)據(jù)的時(shí)候,以制表符進(jìn)行分割來讀取。
3. R語言與操作目錄
在R中,目錄的表達(dá)方法與Windows有所不同,在Windows中,如果要表示D盤下的某個(gè)目錄,就是D:\biotest,用的是\,而在R中,則是/或\,即D:/biotest或D:\biotest。為了避免在R中使用轉(zhuǎn)義字符,可以使用file.path()函數(shù)來構(gòu)建正確的路徑。這個(gè)函數(shù)類似于paste(),會(huì)將傳入的各個(gè)參數(shù)拼接在一起,與操作系統(tǒng)的設(shè)置無關(guān),如下所示:
設(shè)置目錄file.path()
file.path("D:","biotest")
[1] "D:/biotest"
使用file.path()來設(shè)置工作目錄非常方便,可以逐一指定目錄,它會(huì)將各個(gè)目錄連接起來,如下所示:
getwd()
[1] "D:/"
setwd(file.path("D:","biotest"))
getwd()
[1] "D:/biotest"
操作文件dir()或list.files()
有的時(shí)候,在R中如果要遍歷某個(gè)指定目錄下的所有文件和文件夾,并對(duì)它們進(jìn)行某種操作,如果要獲得指定目錄下的文件列表,可以使用list.files()或dir()函數(shù),這兩個(gè)函數(shù)的功能是一樣的,如下所示:
getwd()
## [1] "C:/Users/Administrator/Documents"
list.files()
## [1] "desktop.ini" "My Music"
## [3] "My Pictures" "My Videos"
## [5] "SafeNet Sentinel" "Trim28.dna"
dir()
## [1] "desktop.ini" "My Music"
## [3] "My Pictures" "My Videos"
## [5] "SafeNet Sentinel" "Trim28.dna"
## 也可以查看某個(gè)特定文件夾的內(nèi)容:
```dir(file.path("C:","My Music","Trim28.dna"))
## character(0) # 沒有子文件
返回文件目錄dirname與文件名basename
- dirname函數(shù)只返回文件目錄,不返回文件名
- basename函數(shù)與之相反,只返回文件名,不返回言論的目錄
file_name <- "C:/Program Files/R/R-devel/bin/x64/RGui.exe" ## 自編路徑示例
file_name
[1] "C:/Program Files/R/R-devel/bin/x64/RGui.exe"
basename(file_name)
[1] "RGui.exe"
dirname(file_name)
[1] "C:/Program Files/R/R-devel/bin/x64"
文件操作函數(shù)匯總
常用的幾個(gè)操作文件以及目錄的函數(shù),如下所示:
list.files:列出某個(gè)目錄下的所有文件
list.dirs: 列出某個(gè)目錄下的所有子目錄
file.exists: 檢查某個(gè)特定的文件是否存在于某個(gè)目錄下
file.create: 創(chuàng)建一個(gè)空文件
file.rename: 重命名文件
file.copy: 復(fù)制文件
file.remove: 刪除文件
unlink: 刪除目錄,例如unlink("tmp", recursive=F) #如果文件夾tmp為空,刪除文件夾tmp;unlink("tmp", recursive=TRUE)#刪除文件夾tmp,如果其中有文件一并刪除
file_test(): 判斷一個(gè)對(duì)象是目錄還是文件,-f為判斷文件,-d是判斷目錄,語法格式為:file_test("-f", "test")。
tempfile: 返回一個(gè)臨時(shí)文件的名稱,例如想要在臨時(shí)文件夾中創(chuàng)建一個(gè)文件,就可以將這個(gè)函數(shù)的返回值傳入file.create()或write.table()函數(shù)中
tempdir: 返回文件系統(tǒng)中臨時(shí)文件目錄的路徑。
dir.create: 創(chuàng)建一個(gè)文件夾或目錄,如果要?jiǎng)?chuàng)建多個(gè)目錄recursive = TRUE
getwd(): 獲取當(dāng)前目錄
setwd() :設(shè)置工作目錄
choose.dir(): 以窗口的形式設(shè)置工作目錄
dir():查看當(dāng)前目錄的子目錄和文件,功能與list.files()相同
文件操作案例
現(xiàn)在創(chuàng)建一個(gè)臨時(shí)文件,并將iris數(shù)據(jù)框傳入其中,然后為了測試數(shù)據(jù)是否已經(jīng)寫入,再讀取這個(gè)文件,并將結(jié)果保存到一個(gè)變量中,然后檢查這個(gè)變量,最后將這個(gè)臨時(shí)文件刪除。
第一步,使用tempfile()函數(shù)得到一個(gè)字符串,它表示系統(tǒng)臨時(shí)目錄中的一個(gè)臨時(shí)文件,如下所示:
my.file <- tempfile()
my.file
## [1] "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\RtmpuAXHeb\\file293c124d68a6"
結(jié)果返回的是一個(gè)字符串,而不是文件,其實(shí)文件并不存在,現(xiàn)在通過write.csv將iris寫入到my.file,然后使用list.files()來查看R創(chuàng)建的文件,如下所示:
write.csv(iris,file=my.file)
list.files(tempdir())
[1] "file293c124d68a6"
[2] "file293c4100540b"
[3] "rs-graphics-9007a42f-5665-4be5-9922-901c327e455a"
其中,file293c124d68a6是臨時(shí)文件,使用read.csv將文件導(dǎo)入到一個(gè)名為file.iris的變量中,并使用str()查看,如下所示:
file.iris <- read.csv(my.file)
str(file.iris)
## 'data.frame': 150 obs. of 6 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : chr "setosa" "setosa" "setosa" "setosa" ...
最后為了恢復(fù)文件系統(tǒng)原來的狀態(tài),使用file.remove()刪除這個(gè)臨時(shí)文件,如下所示:
file.remove(my.file)
list.files(tempdir())這個(gè)文件已經(jīng)被刪除了。
## [1] "file293c4100540b"
## [2] "rs-graphics-9007a42f-5665-4be5-9922-901c327e455a"
## file293c124d68a6這個(gè)文件已被刪除
參考筆記1:R語言基礎(chǔ)-數(shù)據(jù)的導(dǎo)入與導(dǎo)出
參考筆記2:RVDSD