まず、以下のような数値データが書かれたファイルを用意しましょう。
- 仮にこのファイル 名を testdata.txt、
- ディレクトリの位置を /Users/saito/R/data とします。
14
14
21
35
6
まず setwd によって作業ディレクトリを/Users/saito/TMP にします。
setwd("/Users/saito/TMP")
次に scan コマンドを使って、データを変数 x に読み込みます。
(x <- scan("R-intro/data/08-01.txt"))
x にファイルの数値が ベクトル として読み込まれています。
以下のようなタブ区切 りのファイル batters.txt があったとします。
Team At_Bat Hits Home_Runs
Nomura Hawks 10472 2901 657
Harimoto Flyers 9666 3085 504
Kinugasa Carps 9404 2543 504
Oh Giants 9250 2786 868
Kadota Hawks 8868 2566 567
read.table により データ・フレームとして読み込む:
(batters <- read.table("R-intro/data/batters.txt", header=T, sep="\t", row.names=1))
x$Hits などで安打数を得ることができます。
x$Team
x$Hits
read.table の引数の意味 :
- “batters.txt”
- ファイル名
- header = T
- Team, At_Bat など のヘッダーがあることを示す
- sep = “\t”
- タブ区切りであることを示し
- row.names = 1
- 行の名前が1列分あることを指定
read.table の引数のオプション
- quote=””
- 引用符”“の処理をしない。
- check.names=F
- 列ラベル名の自動変換が抑制される。
- omment.char=””
- コメント記号(“#”)を無効にできる。
課題 8: 課題 7-1 の表をタブ区切りファイルとして保存し、データフレー ムとして読み込んでみましょう。
ファイル出力を行なう関数
- 一番簡単なのが write 関数でしょう。
- 変数に格納された数値をファイルに書き出すことができます。
x <- c(10, 12, 15, 19, 21, 34)
write(x, "R-intro/data/outfile1.txt", ncolumns = 1)
- x の内容が R-intro/data/outfile1.txtというファイルに書き込まれます。
- ncolumns = 1 は数 値を1 列で出力することを指定しています。
行列データもファイルに書き出すことが可能で す。
x <- matrix(c(1,2,3,4,5,6), nrow=2, ncol=3, byrow=T)
write(t(x), "R-intro/data/outfile2.txt", ncolumns=ncol(x), sep="\t")
- t(x)
- 行列 x を転置しないと、出力されるファイル中の行列が転置 されたものになってしまうので、注意が必要です。
- ncolumns=ncol(x)
- で出力される列数を行列 x の列数に揃え、
- sep = “\t”
- でタブ区切りファイルにすることを指定しています。
データフレームをファイルに出力する関数
batters[,c(3,4)]
write.table(batters[,c(3,4)], "R-intro/data/outfile3.txt", sep="=\t", row.names=T, col.names=NA)
- row.names=T
- 行名(先頭に空白を挿入)を入れます。
- col.names=NA
- でそれぞれ行名、列名(先頭に空白を挿入)を入れます。
- quote=F
- 指定すると、二重引用符を除いた出力になります。
課題 9: 上記データフレームで、各バッターに対して打率、すなわち Hits / At_Bat を計算 し、その結果を”outfile4.txt”に格納しましょう。
一連の手続きをファイルにしておいて、それを必要なときに実行すること が可能です。
例えば、以下のような操作を記述したファイ ルを用意します。 ファイル名を R-intro/code/substtest.R とします。
x <- c(1,2,3,4,5)
y <- c(2,4,6,8,10)
z <- x + y
これを以下のように source(“substtest.R”)とすると、substtest.R 中に 記述された手続きを 実行することができます。結果として x, y, z それぞ れに値が代入されます。
source("R-intro/code/substtest.R")
c(x,y,z)
課題 10: 課題 8 の手続きを dframetest.R というファイルに書き込み、 source を使ってその 手続きを実行してみましょう。14
関数は数学的にはある入力に対応した出力を返すものです。
コンピュータプログラミングでは、まとまった処理の単位を表します8。
例えば今、二つの数を足して 2 で割る関数 plus を考えます。
これは数学では plus(x, y) = (x + y) / 2 などと記述できます。
R では以下のよう に function を使って以下のように記述します。
plus <- function(x, y) {
return ((x + y) / 2)
}
plus
plus(10,20)
- これによって x と y を入力(引数)とする関数 plus が定義されます。 出力(返り値)が(x + y) / 2 となる。
- その後、 plus(10, 20) とすれば、
- x に 10、y に 20 が代入され、
- 関数plusが実行され,
- return は最終的な返り値を決め,
- 計算結果の 15 という答えが返ってくる。 関数のより一般的な定義の仕方は、
関数名 <- function (引数 1, 引数 2, ···, ...) {
引数を使った様々な処理
return(返り値)
}
f(x, a, b, c) = ax2 + bx + c を R の関数として実装しましょう。 f(4, 3, 2, 1)はいくつ になりますか。