# Rの基礎 ---- # Rは基本はインタプリタ # ※インタプリタ:ソースコードを直接(あるいは中間表現に変換しながら)実行する方式 # インタプリタはエラーのチェックがしやすい(コンパイラに比べて) # Rでのデータの扱い ---- # 単独のデータ ---- # Rで扱えるデータの型:数値,文字,文字列(日本語も一応可能) # Rでは変数あるいはオブジェクトも利用可能: # aという変数に数値3を代入 a=3 # 文字列はダブルクオーテーションかシングルクォーテーションで囲む b="阪神" # あるいは b='阪神' # 複数のコマンドを1行に書くときはセミコロンで区切る a=3; b=4; a+b; # 上記の記述と次の直接計算は同じ結果 3+4 # 1行1コマンドの時はセミコロンは省略可能 # ※なお代入の記号 = は <- でもよい(昔はこっちしか使えなかった) # ※間違って途中で改行してしまった(Enterキーを押してしまった)場合は気にせず次の行に続きを書けばよい a+ b # 変数は代入されたデータにより型(数値や文字列など)を自動判別してくれるので,特に利用者が定義する必要はない # 変数に入っている値の確認は変数名を入力してEnterキーを押せばよい a # 変数の型を調べるためには関数 typeof(), mode(), class() を使えばよい typeof(a) # オブジェクトの詳細なデータ型 mode(a) # オフジェクトのデータ型の表示と変換 class(a) # オブジェクトのクラスの型(属性) # 多次元のデータの扱い ---- # 1次元の連続データの場合 ---- # ベクトルは同じ種類の変数を共通の名前と添え字でひとまとめにしたもの # ※通常の変数が一戸建ての住宅とすると,ベクトルはマンションかアパート # 例えば1から10を10個の変数に代入 a1=1; a2=2; a3=3; a4=4; a5=5; a6=6; a7=7; a8=8; a9=9; a10=10; # めっちゃだるいだけでなく,計算上の使い勝手も悪い # 代わりにc()という関数を利用する #※関数とは何らかの計算をしてくれる処理に名称をつけたもの.Rで用意してくれているものあるし,自分で作ることも可能 a=c(1,2,3,4,5,6,7,8,9,10); # ましになったけど,まだだるい b=c(1:10) # ※連続する値の場合,最初の値,半角のコロン,最後の値で指定できる # ベクトルの各要素を使うときは変数名[添え字] b[3] # ベクトルの長さを調べるときは length() を利用する length(b) # 規則性のあるデータの場合 ---- # 連続でなくて例えば3おきのデータを作りたいときには seq() を用いるとよい seq(from=1, to=10, by=3) # なお from, to, by は省略して次のように書いても同じ結果となる seq(1, 10, 3) # 繰り返しのあるデータを作りたいときは rep() を用いるとよい rep(c(1,4,2), times=3) # 1つめの引数が3回反復 rep(c(1,4,2), each=3) # それぞれ同じもの3回ずつ順に反復 rep(c(1,4,2), len=7) # 1つめの引数を長さが7になるように反復 # 2つめの引数を単に数字だけで与えると times= として解釈される rep(c(1,4,2), 3) # リスト型は文字と数値を混在させることが可能 # c() ではなく,list() を利用する d=list(6, "Kanemoto", "Tomoaki") d[1] d[2:3] # 多次元のデータの場合 ---- # 多次元のデータは行列あるいは配列として扱われる # 行列は2次元配列と同じ # 行列を生成するためには関数 matrix() を用いる matrix(1:10, nrow=5, ncol=2, byrow=F) # 5行×2列の配列となる.ただし数値は1列目,2列目の順に配置される matrix(1:10, nrow=5, ncol=2, byrow=T) # byrow=T とすると1行目,2行目,…という順に配置される matrix(1:10, nrow=5, ncol=2, byrow=T, dimnames=list(LETTERS[1:5],LETTERS[25:26])) # dimnamesを使うと行と列の名前を定義できる # まず行で次に列の順序 # なお LETTERS は英大文字のベクトル.添え字はは1から26 LETTERS[1] e=matrix(1:10, nrow=5, ncol=2, byrow=T) # 行列の各要素を表示する方法は e[1,2] e[,2] e[3,] e[1:3,] # ベクトルやリストを利用しても行列は定義できる f=matrix(list(1,"阪神","タイガース",2,"広島","カープ"), nrow=2, ncol=3, byrow=T) f # 行と列の名前は後から定義することも可能 dimnames(f)=list(list("あ","い"),list("う","え","お")) f # 行列は配列を生成する array() を使っても定義できる array(1:10, dim=c(5,2), dimnames=list(LETTERS[1:5],LETTERS[25:26])) # ただし byrow=F に固定される # 3次元以上の配列は dim で各次元の最大要素数を指定すればよい array(1:8, dim=c(3,3,3), dimnames=list(LETTERS[1:3],LETTERS[8:10],LETTERS[24:26])) # dim() を使うとベクトルを多次元化できる f=1:9 dim(f)=c(3,3) g=1:8 dim(g)=c(3,3) # データフレーム ---- # データフレームは列ごとに異なる型のデータを取ることができて,行方向に1つのまとまりを持つような # データの型である # 表計算ソフトでデータを集計しているのをイメージするとわかりやすいかもしれない # 例えば学生の成績を例にすると,1列目が名前(文字型),2列目が素点(数値型),3列目が評価(文字型) # 学生として岡田,真弓,和田,金本で,素点がそれぞれ90, 40, 60, 70.評価は秀,不可,可,良とする # これをデータフレームとして作成するときには data.frame() を用いればよい h=data.frame(NAME=c("岡田","真弓","和田","金本"), SCORE=c(90,40,60,70), GRADE=c("秀","不可","可","良")) # NAMEやSCOREなどが列名になる # なお列名には日本語も使用可能.列名はダブルクオテーションやシングルクォーテーションで囲んではダメ # 列ごとのデータを取り出すときは,データフレーム名$列名,行ごとのデータを取り出すときは行列と同じ h$NAME h[,2] # 列名を後から変更したいときは colnames() を利用する colnames(h)=c("名前", "素点", "評価") h colnames(h)=c("NAME", "SCORE", "GRADE") #後の例が動かなくなるので元に戻す h # データフレームの行に名前をつけたいときは row.names を利用する h=data.frame(NAME=c("岡田","真弓","和田","金本"), SCORE=c(90,40,60,70), GRADE=c("秀","不可","可","良"), row.names=c("岡田","真弓","和田","金本")) # あるいは h=data.frame(NAME=c("岡田","真弓","和田","金本"), SCORE=c(90,40,60,70), GRADE=c("秀","不可","可","良")) row.names(h)=c("岡田","真弓","和田","金本") # データフレームは order() を使って並べ替えもできる h[order(h$SCORE),] order(h$SCORE) # 降順(大きいものから小さいものの順)に並べ替えるときは次のとおり h[order(-h$SCORE),] order(-h$SCORE) # データ型の調べ方と変換 ---- # すでに説明したようにオブジェクトのデータ型やクラスを調べるためのコマンドとして次のようなものがある typeof(a) # オブジェクトの詳細なデータ型 mode(a) # オフジェクトのデータ型の表示と変換 class(a) # オブジェクトのクラスの型(属性) # このうち typeof() と mode() はオブジェクトの要素の型を,また class() はオブジェクトの所属するクラス,つまり属性の型を表示する # クラスの型が定義されていない場合は,要素の型がそのまま使われる(以下の例で確認) mode(3) class(3) # なおnumeric型の場合はデータストレージ型としてdoubleとintegerが設定されていて typeof() により確認できる mode(3); typeof(3) mode(3L); typeof(3L) # データ型を調べる他のコマンドとしては is.データ型() の形のコマンドが用意されている is.numeric(3) is.character(3) # これらのコマンドは調べる型に引数が一致していると TRUE,不一致だと FALSEを返す # またあるデータ型のオブジェクトを別のデータ型に変換するコマンドとして as.データ型() のコマンドがある as.integer(3) is.double(as.integer(3)) # なおデータ型の変換は引数として与えるオブジェクトが正しくないとエラーが起こる as.character(3) as.numeric("a")