R入門Day8: 數(shù)據(jù)的導(dǎo)入與導(dǎo)出

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是(逗號分隔值)的英文縮寫,通常都是純文本文件。

其導(dǎo)入R中的數(shù)據(jù)格式為:
mydataframe<-read.table(file, header=logical_value, sep="delimiter", row.names="name")
file:csv文件
header:邏輯值,首先是否包括變量名
sep:分隔符 "delimiter"
row.names:指定一個或多個表示行標(biāo)識符的變量

grades<-read.table("studentgrades.csv",header=TRUE,sep=",",row.names="STUDENTID")
#表示從當(dāng)前目錄中讀取一個名為studentgrades.csv的逗號分隔文件
#從文件的第一行取得變量名字岖常,將STUDENTID指定為行標(biāo)識符
#整個結(jié)果保存到grades的數(shù)據(jù)框中。

另外一個導(dǎo)入csv文件的函數(shù)是read.csv()
read.delimread.delim2分別使用句號逗號作為小數(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ù)實現(xiàn)文本文件數(shù)據(jù)的讀取,對于這兩個函數(shù)有幾個重要的參數(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è)置為逗號
  • 除此惋戏,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=“”來進行聲明洼哎,則會把讀入的數(shù)字隱式的都轉(zhuǎn)變成字符;
  • sep:指定各個讀入的數(shù)據(jù)之間的分隔符沼本;默認(rèn)情況下分隔符:空格噩峦、tab;如果不是其它分隔符抽兆,例如“:/”通過SEP來指定识补;
    可以通過list指定讀入變量的變量名,同時生成的對象為列表辫红,則可以同時讀入字符與數(shù)字李请;
  • Skip: 從第幾行開始讀入數(shù)據(jù);
  • Nlines:指定最大讀入行數(shù)厉熟;
    如果通過鍵盤輸入的時候,不希望出現(xiàn)下標(biāo)提示较幌,則可以使用:quiet=TRUE揍瑟;
    encoding =””指定的編碼格式,有時候讀入的中文可能會出現(xiàn)亂碼的時候乍炉,可能通過這個參數(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)建一個名為mydata的數(shù)據(jù)框,含三個變量岛琼,age為數(shù)據(jù)型,gender為字符型槐瑞,weight為數(shù)值型。
## edit調(diào)用文本編輯器,鍵入數(shù)據(jù)那槽。
## 其中numeric(0)創(chuàng)建一個指定模型但不含實際數(shù)據(jù)的變量。
## 如果再次調(diào)用mydata<-edit(mydata)能夠用來修改數(shù)據(jù)骚灸,或者使用fix(mydata)也行。

1.6 使用readxl包來讀取excel文件

readxl包中的幾個函數(shù)可以讀取excel文件甚牲,主要有read_excelread_xls丈钙,read_xlsx。其中各個函數(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ù)著恩,可以是一個字符串,也就是sheet的名稱蜻展,可以是一個整數(shù)喉誊,它表示sheet的位置。如果不輸入這個參數(shù)纵顾,默認(rèn)輸入第1個sheet的數(shù)據(jù)伍茄。
  • range:sheet中單元格的范圍,例如可以輸入range=B2:G14施逾。也可以指定某個sheet敷矫,例如range="mtcars!B1:D5"
  • co_lnames: TRUE 使用第一行作為行名, FALSE 使用默認(rèn)的名字汉额,或者是使用一個字符串或字符串向量來表示第一行的名稱

其余參數(shù)參考readxl資料曹仗。

1.7 批量讀取數(shù)據(jù)

讀取N個Excel文件,并將這N個Excel文件進行合并蠕搜,分為四種情況怎茫,代碼如下所示,其中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ù)

對于文件沒有規(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))

對于文件名沒有規(guī)律的情況祥山,并且只讀取某做后綴的文件,如下所示:

# 加載第三方擴展包掉伏,用于編寫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)建正確的路徑照捡,這個函數(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 讀取錯誤

R語言讀取Excel文件有時會出錯话侧,如果要讀取某些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個(即第No.2不滿足8個元素)新博,無法讀取薪夕,因此需要改變一下代碼原献,如下所示:

x <- read.table("clipboard",sep="\t",header=T)

這樣就能正常讀取了姑隅,因為Excel的文件中讲仰,每個單元格就是以制表符將它們分開的鄙陡,而sep=“\t”的意思就是躏啰,讀取數(shù)據(jù)的時候给僵,以制表符進行分割來讀取想际。

3. R語言與操作目錄

在R中胡本,目錄的表達(dá)方法與Windows有所不同侧甫,在Windows中咒锻,如果要表示D盤下的某個目錄惑艇,就是D:\biotest,用的是\恭取,而在R中,則是/或\攒发,即D:/biotest或D:\biotest晨继。為了避免在R中使用轉(zhuǎn)義字符紊扬,可以使用file.path()函數(shù)來構(gòu)建正確的路徑餐屎。這個函數(shù)類似于paste()腹缩,會將傳入的各個參數(shù)拼接在一起空扎,與操作系統(tǒng)的設(shè)置無關(guān)转锈,如下所示:

設(shè)置目錄file.path()

file.path("D:","biotest")
[1] "D:/biotest"

使用file.path()來設(shè)置工作目錄非常方便撮慨,可以逐一指定目錄脆粥,它會將各個目錄連接起來变隔,如下所示:

getwd()
[1] "D:/"
setwd(file.path("D:","biotest"))
getwd()
[1] "D:/biotest"

操作文件dir()list.files()
有的時候蟹倾,在R中如果要遍歷某個指定目錄下的所有文件和文件夾喊式,并對它們進行某種操作岔留,如果要獲得指定目錄下的文件列表献联,可以使用list.files()或dir()函數(shù),這兩個函數(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"                    

## 也可以查看某個特定文件夾的內(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ù)匯總
常用的幾個操作文件以及目錄的函數(shù)谒亦,如下所示:
list.files:列出某個目錄下的所有文件
list.dirs: 列出某個目錄下的所有子目錄
file.exists: 檢查某個特定的文件是否存在于某個目錄下
file.create: 創(chuàng)建一個空文件
file.rename: 重命名文件
file.copy: 復(fù)制文件
file.remove: 刪除文件
unlink: 刪除目錄份招,例如unlink("tmp", recursive=F) #如果文件夾tmp為空,刪除文件夾tmp伴箩;unlink("tmp", recursive=TRUE)#刪除文件夾tmp嗤谚,如果其中有文件一并刪除
file_test(): 判斷一個對象是目錄還是文件巩步,-f為判斷文件椅野,-d是判斷目錄籍胯,語法格式為:file_test("-f", "test")杖狼。
tempfile: 返回一個臨時文件的名稱,例如想要在臨時文件夾中創(chuàng)建一個文件理朋,就可以將這個函數(shù)的返回值傳入file.create()或write.table()函數(shù)中
tempdir: 返回文件系統(tǒng)中臨時文件目錄的路徑嗽上。
dir.create: 創(chuàng)建一個文件夾或目錄熄攘,如果要創(chuàng)建多個目錄recursive = TRUE
getwd(): 獲取當(dāng)前目錄
setwd() :設(shè)置工作目錄
choose.dir(): 以窗口的形式設(shè)置工作目錄
dir():查看當(dāng)前目錄的子目錄和文件浅萧,功能與list.files()相同

文件操作案例

現(xiàn)在創(chuàng)建一個臨時文件洛史,并將iris數(shù)據(jù)框傳入其中,然后為了測試數(shù)據(jù)是否已經(jīng)寫入土思,再讀取這個文件己儒,并將結(jié)果保存到一個變量中闪湾,然后檢查這個變量江醇,最后將這個臨時文件刪除。

第一步条辟,使用tempfile()函數(shù)得到一個字符串,它表示系統(tǒng)臨時目錄中的一個臨時文件杭棵,如下所示:

my.file <- tempfile()
my.file
## [1] "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\RtmpuAXHeb\\file293c124d68a6"

結(jié)果返回的是一個字符串鹰祸,而不是文件粗井,其實文件并不存在,現(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是臨時文件赔癌,使用read.csv將文件導(dǎo)入到一個名為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()刪除這個臨時文件,如下所示:

file.remove(my.file)
list.files(tempdir())這個文件已經(jīng)被刪除了绰上。
## [1] "file293c4100540b"                                
## [2] "rs-graphics-9007a42f-5665-4be5-9922-901c327e455a" 
## file293c124d68a6這個文件已被刪除

參考筆記1:R語言基礎(chǔ)-數(shù)據(jù)的導(dǎo)入與導(dǎo)出
參考筆記2:RVDSD

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迷扇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祈秕,更是在濱河造成了極大的恐慌,老刑警劉巖获印,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳍征,死亡現(xiàn)場離奇詭異,居然都是意外死亡氮双,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谐丢,你說我怎么就攤上這事≈缘瑁” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵竣况,是天一觀的道長。 經(jīng)常有香客問我娶视,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任劫映,我火速辦了婚禮泳赋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘校坑。我一直安慰自己千诬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布邪驮。 她就那樣靜靜地躺著毅访,像睡著了一般盘榨。 火紅的嫁衣襯著肌膚如雪草巡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天弛饭,我揣著相機與錄音侣颂,去河邊找鬼藻肄。 笑死,一個胖子當(dāng)著我的面吹牛婆翔,可吹牛的內(nèi)容都是我干的雄妥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼雀费,長吁一口氣:“原來是場噩夢啊……” “哼辕羽!你這毒婦竟也來了铣口?” 一聲冷哼從身側(cè)響起叔遂,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤疮丛,失蹤者是張志新(化名)和其女友劉穎呢蔫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體认然,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡窑睁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年狭姨,在試婚紗的時候發(fā)現(xiàn)自己被綠了师抄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡媚污,死狀恐怖榜轿,靈堂內(nèi)的尸體忽然破棺而出诬烹,到底是詐尸還是另有隱情家破,我是刑警寧澤玄妈,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布鸭你,位于F島的核電站愉老,受9級特大地震影響咒林,放射性物質(zhì)發(fā)生泄漏澎粟。R本人自食惡果不足惜宫补,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狰贯。 院中可真熱鬧驱负,春花似錦娱局、人聲如沸任斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喂击。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間免胃,已是汗流浹背银室。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留否过,地道東北人苗桂。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓煤伟,卻偏偏與公主長得像便锨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姚建,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容