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