R 作為統(tǒng)計(jì)學(xué)專業(yè)工具,如果只能人工的導(dǎo)入和導(dǎo)出數(shù)據(jù)將使其功能變得沒(méi)有意義,所以 R 支持批量的從主流的表格存儲(chǔ)格式文件(例如 CSV、Excel、XML 等)中獲取數(shù)據(jù)。
CSV(Comma-Separated Values,CSV,有時(shí)也稱為字符分隔值,因?yàn)榉指糇址部梢圆皇嵌禾?hào)) 是一種非常流行的表格存儲(chǔ)文件格式,這種格式適合儲(chǔ)存中型或小型數(shù)據(jù)規(guī)模的數(shù)據(jù)。
由于大多數(shù)軟件支持這個(gè)文件格式,所以常用于數(shù)據(jù)的儲(chǔ)存與交互。
CSV 本質(zhì)是文本,它的文件格式極度簡(jiǎn)單:數(shù)據(jù)一行一行的用文本保存起來(lái)而已,每條記錄被分隔符分隔為字段,每條記錄都有同樣的字段序列。
以下是一個(gè)簡(jiǎn)單的 sites.csv 文件(存儲(chǔ)在測(cè)試程序的相同目錄下):
id,name,url,likes 1,Google,www.google.com,111 2,Nhooo,www.jixiangtaizi.com.cn,222 3,Taobao,www.taobao.com,333
CSV 用逗號(hào)來(lái)分割列,如果數(shù)據(jù)中含有逗號(hào),就要用雙引號(hào)將整個(gè)數(shù)據(jù)塊包括起來(lái)。
注意:包含非英文字符的文本要注意保存的編碼,由于很多計(jì)算機(jī)普遍使用 UTF-8 編碼,所以我是用 UTF-8 進(jìn)行保存的。
注意: CSV 文件最后一行需要保留一個(gè)空行,不然執(zhí)行程序會(huì)有警告信息。
Warning message: In read.table(file = file, header = header, sep = sep, quote = quote, : incomplete final line found by readTableHeader on 'sites.csv'
接下來(lái)我們就可以使用 read.csv() 函數(shù)來(lái)讀取 CSV 文件的數(shù)據(jù):
data <- read.csv("sites.csv", encoding="UTF-8") print(data)
如果不設(shè)置 encoding 屬性,read.csv 函數(shù)將默認(rèn)以操作系統(tǒng)默認(rèn)的文字編碼進(jìn)行讀取,如果你使用的是 Windows 中文版系統(tǒng)且沒(méi)有設(shè)置過(guò)系統(tǒng)的默認(rèn)編碼,那系統(tǒng)的默認(rèn)編碼應(yīng)該是 GBK。所以大家請(qǐng)盡可能地統(tǒng)一文字編碼以防出錯(cuò)。
執(zhí)行以上代碼輸出結(jié)果為:
id name url likes 1 1 Google www.google.com 111 2 2 Nhooo www.jixiangtaizi.com.cn 222 3 3 Taobao www.taobao.com 333
read.csv() 函數(shù)返回的是數(shù)據(jù)框,我們可以很方便的對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)處理,以下示例我們查看行數(shù)和列數(shù):
data <- read.csv("sites.csv", encoding="UTF-8") print(is.data.frame(data)) # 查看是否是數(shù)據(jù)框 print(ncol(data)) # 列數(shù) print(nrow(data)) # 行數(shù)
執(zhí)行以上代碼輸出結(jié)果為:
[1] TRUE [1] 4 [1] 3
以下統(tǒng)計(jì)數(shù)據(jù)框中 likes 字段最大對(duì)數(shù)據(jù):
data <- read.csv("sites.csv", encoding="UTF-8") # likes 最大的數(shù)據(jù) like <- max(data$likes) print(like)
執(zhí)行以上代碼輸出結(jié)果為:
[1] 333
我們也可以指定查找條件,類似 SQL where 子句一樣查詢數(shù)據(jù),需要用到到函數(shù)是 subset()。
以下示例查找 likes 為 222 到數(shù)據(jù):
data <- read.csv("sites.csv", encoding="UTF-8") # likes 為 222 的數(shù)據(jù) retval <- subset(data, likes == 222) print(retval)
執(zhí)行以上代碼輸出結(jié)果為:
id name url likes 2 2 Nhooo www.jixiangtaizi.com.cn 222
注意:條件語(yǔ)句等于使用 ==。
多個(gè)條件使用 & 分隔符,以下示例查找 likes 大于 1 name 為 Nhooo 的數(shù)據(jù):
data <- read.csv("sites.csv", encoding="UTF-8") # likes 大于 1 name 為 Nhooo 的數(shù)據(jù) retval <- subset(data, likes > 1 & name=="Nhooo") print(retval)
執(zhí)行以上代碼輸出結(jié)果為:
id name url likes 2 2 Nhooo www.jixiangtaizi.com.cn 222
R 語(yǔ)言可以使用 write.csv() 函數(shù)將數(shù)據(jù)保存為 CSV 文件。
接著以上示例,我們將 likes 為 222 的數(shù)據(jù) 保存到 nhooo.csv 文件:
data <- read.csv("sites.csv", encoding="UTF-8") # likes 為 222 的數(shù)據(jù) retval <- subset(data, likes == 222) # 寫(xiě)入新的文件 write.csv(retval,"nhooo.csv") newdata <- read.csv("nhooo.csv") print(newdata)
執(zhí)行以上代碼輸出結(jié)果為:
X id name url likes 1 2 2 Nhooo www.jixiangtaizi.com.cn 222
X 來(lái)自數(shù)據(jù)集 newper,可以通過(guò)參數(shù) row.names = FALSE 來(lái)刪除它:
data <- read.csv("sites.csv", encoding="UTF-8") # likes 為 222 的數(shù)據(jù) retval <- subset(data, likes == 222) # 寫(xiě)入新的文件 write.csv(retval,"nhooo.csv", row.names = FALSE) newdata <- read.csv("nhooo.csv") print(newdata)
執(zhí)行以上代碼輸出結(jié)果為:
id name url likes 1 2 Nhooo www.jixiangtaizi.com.cn 222
執(zhí)行完后,我們就可以看到 nhooo.csv 文件生成成功了。