R(RStudio)を使う(3)

実際に少しだけRを使ってみましょう。「電卓として」は本当に初めての人以外飛ばしてかまわないと思います。「電卓を超えて」はRにおけるオブジェクトの説明を簡単にしています。「ベクトルとデータフレーム」ではRで特に頻出するオブジェクトであるベクトルとデータフレームの説明です。

電卓として

電卓として使ってみます。以下のコードをConsoleペインに(コメントを除き)直接入力するか、スクリプトファイルに記述して実行してみます。なお、「#」に続いて記述されている部分はコメントとなりますので、Rは何も返しません。

# 1 + 2 = ?
1+2
# 2 / 3 = ?
2/3
# ルート2は?
sqrt(2)
# 2の2乗は?
2^2
# log2 = ?
log(2)

実際のRには、プロンプト(>)が表示されていますので、入力後は、結果も含めて下記の通りになります。

> # 1 + 2 = ?
> 1+2
[1] 3
> # 2 / 3 = ?
> 2/3
[1] 0.6666667
> # ルート2は?
> sqrt(2)
[1] 1.414214
> # 2の2乗は?
> 2^2
[1] 4
> # log2 = ?
> log(2)
[1] 0.6931472

いわゆる電卓と同等の計算は、他の言語とも大差なく、普通に実行可能です。

電卓を超えて

Rを使いこなすための第1歩は、関数や演算子を用いてデータを扱うことになれることです。そのために、オブジェクトについて少し知っておく必要があります。

オブジェクト

Rでは、関数や、演算子、データなど、Rで読み込んだすべてのものをオブジェクトと呼びます。これは、関数の引数や返り値も同様です。

オブジェクトはクラスと長さを持ち、それぞれclass()関数length()関数で調べることができます。また、データは、クラスと長さに加え、構造も持ちます。

他の言語が変数に値を代入するように、Rでもオブジェクトに値を付値します。

オブジェクト <- 値

このとき、値の書き方はデータ構造によって変わります。以下の例では、xというオブジェクトに1~5の値を付値する例と、datというオブジェクトにCSVファイルに保存したデータを読み込む例を示しています。

> # ベクトルの場合
> x <- c(1, 2, 3, 4, 5)
> x
[1] 1 2 3 4 5
> # データフレームにデータを読み込む場合(*)
> # dat <- read.csv("data/test.csv")
> # head(dat)

*:データの読み込み結果の表示は省略しています。この例では、プロジェクトフォルダにdataフォルダを作り、その中にtest.csvが保存されているという設定です。

上記、コードでc()関数は、ベクトルを作成する関数、read.csv()関数は、CSVファイルに保存されたデータを読み込む関数、 head()関数は、オブジェクトの最初の6行を表示する関数です。「<-」は、右辺を左辺に付値するための記号(最近は「=」もよく使われる)です。

オブジェクトの名前の付け方は、下記のルールに従っていれば自由です。

  • アルファベットで始まり、途中に数字、ピリオド、アンダーバーを含むことができる(最近は日本語も扱えますが、推奨しません)。
  • 大文字と小文字は別物
  • 長さは自由
  • 予約語は使えない。(予約語:if、else、repeat、while、function、for、in、next、break、TRUE、FALSE、NULL、Inf、NaN、NA、NA_integar_、NA_real_、NA_complex_、NA_character_...、..1、..2、$、%、^、*、+、-、(、)、[、]、#、!、?、 >、<、=)

データのクラスとデータ構造

データのクラスとデータ構造を少しだけ紹介しておきます。使っていくうちになれていく類いのものですが、どこかで一度きちんと整理した方がRの扱いに慣れやすくなると思います。

データのクラス

主なデータのクラスは下記の通りで、下に行くほど「強い」クラスになります。

  • logical(論理)
  • numeric(数値)(factor(因子)とinteger(整数)を含む。)
  • complex(複素数)
  • character(文字)
データ構造

主なデータ構造は下記の通りです。

  • vector(ベクトル)
  • matrix(行列)とarray(配列)
  • data.frame(データフレーム)
  • list(リスト)

データ構造が同じであれば、データクラスが異なっても、データ同士を結合することが出来ます。この時、データクラスの強さが問題となります。つまり、データクラスの強い方に統一されるのです。

ベクトルとデータフレーム

オブジェクトの例として、すぐに触れることになるベクトルとデータフレームについて、もう少しだけ説明しておきます。

ベクトル

ベクトルは、同じ型のデータの集まりで、c()関数で作成できます。また、便利な作成方法として、1:10などのようにすれば、1~10までの10の要素を持つ連番を作成できます。このように数値と数値を「:」で結んだ場合、区切りは1となります。他にも、 rep()関数や、seq()関数がベクトルを作成するときによく使われています。

> (x1 <- rep(1:4, 2))
[1] 1 2 3 4 1 2 3 4
> (x2 <- rep(c(1, 4), each=2 ))
[1] 1 1 4 4
> (x3 <- rep(c(5, 8, 1, 4), c(2, 1, 2, 3)))
[1] 5 5 8 1 1 4 4 4
> (x4 <- rep(1:4, each=2 , times=3 ))
[1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4
> (y1 <- seq(0, 1, by=0 .1))
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> (y2 <- seq(0, 1, length.out=1 1))
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> (y3 <- seq(1, 9, by=2 ))
[1] 1 3 5 7 9
> (y4 <- seq(1, 10, by=2 ))
[1] 1 3 5 7 9
> (z1 <- 1:10)
[1] 1 2 3 4 5 6 7 8 9 10
> (z2 <- -1:1)
[1] -1 0 1

上記の通り、rep()関数は、最初の引数を繰り返しの指定に従って繰り返したベクトルを作成します。seq()関数では、1番目と2番目の引数で指定された区間を指定された方法で区切ったベクトルを作成します。y4のように区切り方によっては、第2引数と最大値が異なる場合もあるので注意してください。

データフレーム

データフレームは自分で作成するより、読み込んだデータを付値したオブジェクトとしてよく使われます。データフレームの特徴は、型の違うベクトルを同じ長さで複数所持している点です。リストなどと異なる点は、所持できるのが、同じ長さのベクトルという点です。データフレームの中に行列や配列を持つことは出来ないと考えてください。無理矢理作成することは出来ますが、行列として保持する訳ではなく、分解されてベクトルとして保持することになります。

一般的なデータセットを読み込んだ場合は、データフレームになります。