だれかのメモ帖

テクノロジー全般のメモ

R勉強メモ(基礎編)

ISITのRを用いたデータ分析基礎を受講したのでメモ

Rとは?

Rの概要

Rの基礎

Rを用いたデータ分析の基礎

Rのオブジェクト

変数、データ、関数など 名前を付ける=付値

[オブジェクト名] <- [値] でオブジェクトに値を代入する。

> X <- 1

Rの作業ディレクトリ

以下で確認可能 作業ディレクトリ配下のデータファイルを読み込む

> getwd()
[1] "/hogehoge"

作業ディレクトリを変更するとき

> setwd("/work")

helpと終了

> help(関数名)
> q()
> quit()

データタイプとデータ構造

型+構造でデータを表現

 データタイプ

  • logical 2値
  • integer 整数
  • double 実数
  • complex 複素数
  • character 文字列(演算はできない)

データタイプの確認方法

> typeof(obj)

Rはデータタイプを自動的に決定する。

数値は明示しない限りdouble型 タイプが混じった演算はより大きい型になる

データ構造

  • スカラ
  • ベクタ
  • 行列
  • リスト
  • データフレーム (ベクタをまとめて表とする)

スカラ

単一のデータを持つ 定数、変数

ベクタ

同一データタイプを一次元で列挙したもの

要素アクセス ベクタ[要素番号] ベクタ[c(要素番号, 要素番号...)]

数値ベクタ

> 3:6
[1] 3 4 5 6

seq関数を使って、初項、末項、公差を指定してベクタを生成する。

> seq(4, 8, by=2)
[1] 4 6 8 

rep関数を使って、xをm回繰り返して並べたベクタを生成

> rep(6:7, times=2)
[1] 6 7 6 7 

c関数を使って、任意のベクタを生成

> c(1,2,1,1)
v1 <- 1:5

ベクタ同士を連結

> c(v1, 6:10)
1 2 3 4 ... 10

scan関数を使って、ファイルからベクタを読み込み

scan("ファイル名", skip=s, nlines=n) skipは先頭s行をスキップすることを示している。 nlinesはn行のデータを読み込むことを示している。

rnorm(n, mean=m, sd=d)を使ってガウス分布に従った、乱数列を得る 項数n, 平均m, 標準偏差d

runif(n, max=mx, min=mn)を使って一様分布に従った、乱数列を得る 項数n, 最大値max, 最小値min

その他もあり

行列

列と行に要素を並べたデータ型

matrix(v1, nrow=n1, ncol=n2, byrow={TRUE|FALSE}) ベクタv1からn1行n2列の行列を生成 byrowで列優先か行優先かきまる。(元のベクタが列に準ずるか行に順ずるか)

n1n2がv1の要素数と一致 =>  v1の全要素が行列化 n1n2がv1の要素数より大きい => v1の要素を繰り返し n1n2がv1の要素数より小さい => v1の要素をn1n2までの要素で生成

元のベクタのもっとも表現力の高いデータタイプになる ncolを省略した場合は自動で決定。(割り切れない場合は上のルールでデータ埋められる) byrowはデフォルトTRUE

要素取り出し

mat[3] => 3行目1列のデータをスカラ値として返す mat[1,1] => 1行1列のデータをスカラ値として返す mat[1,] => 1行目のすべてをベクタとして返す mat[,1] => 1列目のすべてをベクタとして返す mat[c(1,3),] => 1,3行目を抜き出した新しい行列を返す

リスト

異なるタイプのオブジェクトを一次元に並べて管理するデータ型

list(n1=o1, n2=o2,...) キーn1にオブジェクトo1を格納 キーn2にオブジェクト02を格納 したリストを生成する。

> testList <- list(name="test", number=20)
> testList
$name
[1] "test"

$number
[1] 20

str(<listオブジェクト>) でリストの構造を表示する

> str(testList)
List of 2
 $ name  : chr "test"
 $ number: num 20

<リストオブジェクト>$<キーの名前> <リストオブジェクト>2 <リストオブジェクト>"<キーの名前>" で要素アクセスする

また、 <リストオブジェクト>[数値範囲] <リストオブジェクト>["<キーの名前>"] とすると リスト型で返却される

> testList$number
[1] 20

データフレーム

リストの一種 表を表現したもの

1要素 (=行) は異なるタイプのオブジェクトの列となっている 1変量 (=列) はデータフレーム中ですべて同じ要素数となっている必要がある。

data.frame()によってデータフレームを生成する。

read.csv("<ファイル名>", header={TURE(default)|FALSE}, sep=","(default)) によって、CSVファイルを読出してデータフレームに付値する

ベクタの羅列からデータフレームを生成することも可能 ※各ベクタの要素数は同じである必要がある

str(<データフレームオブジェクト>)で構造を確認可能

> df<-data.frame()
> df<-read.csv("example-readtable.csv")
> df
  Name Japanese Math English Chemistry Geography
1 AAAA       55   70      80        45        60
2 BBBB       90   50      90        40        80
3 CCCC       60   65      65        60        60
4 DDDD       80   85      85        80        70
5 EEEE       95   40     100        70        50
> str(df)
'data.frame':   5 obs. of  6 variables:
 $ Name     : Factor w/ 5 levels "AAAA","BBBB",..: 1 2 3 4 5
 $ Japanese : int  55 90 60 80 95
 $ Math     : int  70 50 65 85 40
 $ English  : int  80 90 65 85 100
 $ Chemistry: int  45 40 60 80 70
 $ Geography: int  60 80 60 70 50

要素アクセス

一重の大かっこ <データフレームオブジェクト>[1] <データフレームオブジェクト>["<変量名>"]

=> ある一変量の全データがデータフレーム型で返却される

二重の大かっこ [] <データフレームオブジェクト>1 <データフレームオブジェクト>"<変量名>"

=> ある一変量の全データがベクタ型で返却される

> df[2]
  Japanese
1       55
2       90
3       60
4       80
5       95
> df[[2]]
[1] 55 90 60 80 95

<データフレームオブジェクト>[<行番号>, <列番号|変量名>]

=> ある一要素、または部分データフレーム

※ある行すべてを抜き出す場合列番号は省略

> df[1,1]
[1] AAAA
Levels: AAAA BBBB CCCC DDDD EEEE
> df[1,1:2]
  Name Japanese
1 AAAA       55

データフレームからのデータ抽出

subset(<データフレーム>, subset=抽出条件, select=抽出変量)関数で、条件に従ったデータを抜き出し

> subset(df, subset=Japanese>70)
  Name Japanese Math English Chemistry Geography
2 BBBB       90   50      90        40        80
4 DDDD       80   85      85        80        70
5 EEEE       95   40     100        70        50

> subset(df, subset=Japanese>70, select = c(Japanese,English))
  Japanese English
2       90      90
4       80      85
5       95     100

データフレームの結合

merge(x, y) x,y データフレームの結合 共通の変量で同じ要素を持つものはマージされる

edit(df) df データフレーム エディタが表示され、データを編集できる ※返り値に編集されたデータフレームが返却される。

因子(Factor)

文字列などは因子型として管理される 文字列ベクタに現れる要素に水準値をつけ、その水準値でデータを表現する。

factor(v) vはベクタ

水準は辞書順に値が与えられる。

水準値を自分で与えることもできる。

factor(v, levels=lv, ordered={TRUE|FALSE}) lv 水準ベクタ ※lvに含まれていない、要素がvにあるとエラー

ordered 順序関係を規定するか?(TRUEの場合、水準ベクタの要素順に大小関係が規定されている) ※四則演算には意味がないのでエラー

演算

四則演算

スカラとベクタの四則演算

ベクタのすべての要素にスカラ値との四則演算結果となる

ベクタベクタの四則演算

対応する要素同士の演算となる

ベクタベクタの比較演算

論理値ベクタが返る

素数が異なるベクタ同士の演算

長い方に合わせて、短い方を繰り返す

ベクタの演算

内積外積

行列の演算

四則演算 各要素の演算 行列演算も可能

データの性質

質的データ

四則演算ができないデータ

名義尺度

便宜的に、数値を割り振ったデータ

一致/不一致 比較、計数

順序尺度

順序に意味がる名義尺度

大小比較

量的データ

間隔尺度

順序が等間隔で定義される順序尺度

加減算が可能

比例尺度

原点が設定されている間隔尺度

剰余算が可能