Data Input & Output
parent.env(globalenv())
程式碼輸入與輸出
從 R 中載入並執行指令稿中的程式碼
source("script.R")
R 在執行程式時,可以順便輸出執行的內容
source("script.R", echo = TRUE)
將 R 中執行過的歷史指令儲存在檔案中
savehistory("my_history.R")
載入檔案中的歷史指令
loadhistory("my_history.R")
R 內建資料
R 的 datasets 套件提供了大約 100 個內建的資料集
data()
# Data sets in package ‘datasets’:
# AirPassengers Monthly Airline Passenger Numbers 1949-1960
# BJsales Sales Data with Leading Indicator
# BJsales.lead (BJsales) Sales Data with Leading Indicator
# BOD Biochemical Oxygen Demand
# CO2 Carbon Dioxide Uptake in Grass Plants
....
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
to list the data sets in all available packages.
data(package = .packages(all.available = TRUE))
Data sets in package ‘blotter’:
IBM IBM stock price data for one month
amzn Hypothetical Intra-Day AMZN Trades
amzn.trades (amzn) Hypothetical Intra-Day AMZN Trades
Data sets in package ‘survival’:
aml (leukemia) Acute Myelogenous Leukemia survival data
bladder Bladder Cancer Recurrences
bladder1 (bladder) Bladder Cancer Recurrences
bladder2 (bladder) Bladder Cancer Recurrences
cancer NCCTG Lung Cancer Data
..
CSV 檔案輸入
read.csv("data-1.csv")
sep 參數可指定分隔字元:
read.csv("data-tab-1.csv", sep = "\t")
read.csv 亦可接受 URL:
read.csv("http://www.your.host/data.csv")
文字檔案輸入
scan() 可以將檔案中的資料直接讀取進來,變成一個向量:
scan("data-2.txt")
使用 scan 配合樣板讀取資料:
scan("data-3.txt", list(name = "", val.a = 0, val.b = 0))
假設文字檔 data-3.txt 每一筆資料包含一個字串與兩個數值:
John 2.4 33 Joe 3.2 12 Mary 9.2 11
Dan 6 23 Willy 3.9 33
scan("data-3.txt", list(name = "", val.a = 0, val.b = 0))
Read 5 records
$name
[1] "John" "Joe" "Mary" "Dan" "Willy"
$val.a
[1] 2.4 3.2 9.2 6.0 3.9
$val.b
[1] 33 12 11 23 33
假設文字檔 data-4.txt 都是一些字元,例如:
Mary Joe John
Willy Dan
則使用:
scan("data-4.txt", "")
Read 5 items
[1] "Mary" "Joe" "John" "Willy" "Dan"
資料檔案輸出
sink() : 讓程式的輸出訊息直接儲存至檔案
sink("sink-example.txt")
i <- 1:3
outer(i, i, "*")
sink()
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 4 6
[3,] 3 6 9
save 函數可以將變數儲存於硬碟中
x <- c(1.2, 3.4, 5.6)
y <- x ^ 2
save(x, y, file = "xy.RData")
x
# [1] 1.2 3.4 5.6
y
# [1] 1.44 11.56 31.36
save 函數預設在儲存資料時會使用 gzip 壓縮格來儲存,如果要儲存的資料非常大,可以更改壓縮的演算法:
壓縮格式 | 壓縮檔大小 |
---|---|
gzip(預設值) | 5.3 MB |
bzip2 | 4.8 MB |
xz | 4.4 MB |
x.large <- runif(10^6)
x.large
[1] 0.791662516 0.107012027 0.703947517 0.205865177 0.872278025 0.417421515
[7] 0.563431149 0.500942581 0.405978959 0.957555548 0.006970087 0.002726804
[13] 0.603437413 0.025101994 0.119972033 0.054228063 0.215705717 0.660148392
[19] 0.920135016 0.158853791 0.677411942 0.018811909 0.127694370 0.834118336
[25] 0.052092139 0.806651688 0.278356788 0.328365936 0.862158333 0.410019493
object.size\(x.large\)
# 8000040 bytes
save\(x.large, file = "compress.xz", compress = "xz"\)
load 函數則可將儲存的變數載入:
``` rm(list = ls()) load("xy.RData")
ls() [1] "x" "y"
ls.str() x : num [1:3] 1.2 3.4 5.6 y : num [1:3] 1.44 11.56 31.36
* ##### saveRDS(): 儲存單一個變數,也可以使用 saveRDS 來將資料儲存為 rds 檔:
saveRDS(women, "women.rds")
* ##### readRDS(): 從 rds 檔案中載入變數,可以使用 readRDS 函數:
women2 <- readRDS("women.rds") identical(women, women2)
* ##### write.csv(): 將 R 的 data frame 輸出為 csv 檔,可以使用 write.csv 函數:
write.csv(cars, file = "output-cars.csv")
* ##### write.table(): 函數的功能與 write.csv 類似,但可用 sep 指定分隔字元:
write.table(cars, file = "output-cars.csv", sep = "\t")
* #### 圖形檔案輸出
* ##### png() 函數: 可以將圖形輸出為 png 點陣圖檔:
set.seed(5) x <- rnorm(100) png("output.png", width = 640, height = 360) # 設定輸出圖檔 hist(x) # 繪圖 dev.off() # 關閉輸出圖檔
* ##### jpeg、tiff 與 bmp 這些函數也可以將圖形輸出成各種不同的點陣圖檔,使用方式跟 png 函數都相同。
* ##### 若要輸出向量圖,可以使用 pdf 或是 svg 函數:
pdf("output.pdf", width = 4, height = 3) hist(x) dev.off()
* ##### postscript\(\): 如果要將 R 所繪製的圖形放在 LaTeX 中使用,可以使用 postscript 指令輸出成適用於 LaTeX 環境的 eps 向量圖檔:
postscript("output.eps", width = 4.0, height = 3.0, horizontal = FALSE, onefile = FALSE, paper = "special", family = "ComputerModern", encoding = "TeXtext.enc") hist(x) dev.off()
* #### ggplot2
library(ggplot2)
* ##### print(): 如果使用 ggplot2 套件在指令稿中畫圖時,必須加上 print 才能使圖形檔案正常輸出:
pdf("output.pdf", width = 4, height = 3) print(qplot(x)) dev.off()
* ##### ggplot2 本身也提供了一個 ggsave 圖形輸出函數,它可以在 R 互動式的操作模式中,將已經畫在螢幕上的圖形輸出為圖檔:
qplot(x) ggsave("plot.pdf", width = 4, height = 3) ```