Rの基本機能とデータ構造

Rの基本的なルールを知ろう

Rの基本的なルールを押さえておくことは、AIが生成するRコードを素早く理解し、思わぬエラーに適切に対処する上でとても重要です。

この記事ではRの重要なルールであるデータ型(数値型、文字列型、論理型など)や、データを整理するための形式(ベクトル、マトリックス、リスト、データフレームなど)を学びます。

Rのデータ型について

Rではデータの形式に様々な種類があり、それぞれルールが異なります。

データ型 説明
論理型 (logical) TRUE または FALSE のいずれか。数値(1/0)として扱える。条件判定に利用可能。
整数型 (integer) 整数値を格納。数値演算が可能。実数型・文字列型への変換が可能。
実数型 (numeric) 浮動小数点数を格納。数値演算が可能。整数型・文字列型への変換が可能。Inf, -Inf, NaN などの特殊な数値も扱える。
文字列型 (character) 文字列を格納。文字列操作(結合、切り出し、置換など)が可能。数値への変換を試みることができる。他のデータ型の文字列表現に変換できる。
ファクター型 (factor) カテゴリカルデータを格納。レベル(カテゴリ)の操作が可能。文字列型との相互変換が可能。内部の整数表現をas.integer()で取得可能。
NA (欠損値) データが欠損していることを示す特殊な値。どのデータ型にも適用可能。演算の結果は NA になりやすい。is.na() で NA かどうかを判定できる。na.rm オプションなどで処理可能。

数値・文字列データをオブジェクトに格納

計算結果を変数に格納します。


x <- 10 / 2
x

[1] 5

文字列として格納する際は "" で囲みます。


number_character <- "5"
class(number_character)

[1] "character"

Rの基本データ構造:ベクトル、マトリックス、リスト

1. ベクトル:一次元のデータの集合

ベクトルは、複数の値を一列に並べて格納するデータ構造です。複数の数値を格納するには c() 関数を使います。


ベクトル1 <- c(15, 22, 8, 30, 11)
ベクトル1

[1] 15 22  8 30 11

文字列も格納できます。


ベクトル2 <- c("リンゴ", "バナナ", "オレンジ")
ベクトル2

[1] "リンゴ"   "バナナ" "オレンジ"

ベクトルに格納された一つ一つの値を「要素」と呼びます。ベクトルの重要な性質として、原則的に同じ種類のデータしか格納できないという点があります。異なる種類のデータを混ぜてしまうと、Rは最も柔軟性の低いデータ型に合わせて変換します。

どういうことかというと、ベクトルに数値、文字列、論理値などを混ぜると、すべて文字列として扱われます。


ベクトル3 <- c("血液型", "A", 45, TRUE, 3.6)
ベクトル3

[1] "血液型" "A"      "45"     "TRUE"   "3.6"

日付データと文字列データの混在もできません。


ベクトル4 <- c("2023-12-20", "実験開始日", "2024-03-10", "実験終了日")
ベクトル4

[1] "2023-12-20" "実験開始日" "2024-03-10" "実験終了日"

ベクトルの要素は先頭から1,2,3,4...と番号(インデックス)が振られています。インデックスを[]で指定して取り出せます。


vector3[1]

[1] "血液型"

複数の要素をまとめて取り出すには、c() 関数を使います。


ベクトル3[c(1,2)]

[1] "血液型" "A" 

2. マトリックス:二次元のデータの集合

マトリックスは、同じ長さのベクトルが結合し格子状に並んだデータ構造です。行と列で構成されます。マトリックスの重要な性質として、原則的に同じ種類のデータしか格納できないという点があります。異なる種類のデータを混ぜてしまうと、ベクトルと同様にRは最も柔軟性の低いデータ型に合わせて変換します(例:数値と文字列を混在させると全て文字列になる)。マトリックスを作成するには、matrix() 関数を使用します。matrix() 関数には、データを格納するベクトル、行数(`nrow`)、列数(`ncol`)、およびデータの配置方向(`byrow`)を指定できます。

例えば、1から6までの数値を格納した3行2列のマトリックスを作成する場合、次のように記述します。


マトリックス1 <- matrix(1:6, nrow=3, ncol=2)
マトリックス1

     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

マトリックスの要素にアクセスするには、`[行, 列]` のようにインデックスを指定します。


マトリックス2[1, 2]

[1] 2

行や列をまとめて取り出すことも可能です。


マトリックス2[1, ]

[1] 1 2

マトリックス2[, 2]

[1] 2 4 6

3. データフレーム

データフレームは、表形式のデータを扱うためのデータ構造です。データフレームは、ExcelやCSVファイルのような行と列で構成されるデータを扱うのに適しています。各列は同じデータ型のベクトルで構成され、列ごとに異なるデータ型を持つことができます。例えば、ある列は数値データを持ち、別の列は文字列データを持つといったことが可能です。

データフレームを作成するには、data.frame() 関数を使用します。この関数には、列として使用するベクトルを引数として渡します。また、read.csv() 関数や read.table() 関数などを使用してファイルから読み込んだデータも、通常はデータフレームとして格納されます。

以下は、データフレームを作成する例です。


id <- c("A001", "A002", "A003")
age <- c(25, 30, 28)
gender <- c("Male", "Female", "Male")

df <- data.frame(id, age, gender)
df

    id age gender
1 A001  25   Male
2 A002  30 Female
3 A003  28   Male

データフレームの各列は、$ の後に列名を書くことで取り出すことができます。例えば、年齢の列を取り出すには df$age と記述します。


df$age

[1] 25 30 28

また、[行, 列] のようにインデックスを指定して、行や列、特定の要素を取り出すことも可能です。例えば、1行目のデータを取得するには、df[1, ]と記述し、2列目のデータを取得するにはdf[, 2]と記述します。行と列の両方のインデックスを指定すれば、特定の要素を取得できます(例:df[1, 2])。


df[1, ]

    id age gender
1 A001  25   Male

df[, 2]

[1] 25 30 28

df[1, 2]

[1] 25

4. リスト:様々なデータをまとめる

リストは、ベクトルやマトリックス、数値、文字列など、異なる種類のデータをまとめて格納できる柔軟なデータ構造です。リストを作成するには、list() 関数を使います。リストは、データフレームとは異なり、各要素が必ずしも同じ長さである必要はありません。この柔軟性が、リストを複雑なデータ構造を扱う際に便利なものにしています。

例えば、数値、ベクトル、文字列ベクトル、マトリックスを要素とするリストを作成する場合、次のように記述します。


ベクトル1 <- 3
ベクトル2 <- c(9, 18, 27)
ベクトル3 <- c("X", "Y")
ベクトル4 <- matrix(c(1, 2, 3, 4), nrow = 2)

リスト1 <- list(ベクトル1, ベクトル2, ベクトル3, ベクトル4)
リスト1

[[1]]
[1] 3

[[2]]
[1]  9 18 27

[[3]]
[1] "X" "Y"

[[4]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

リストの要素を取り出すには、[[番号]] を使います。データフレームのように列名でアクセスすることはできません。


リスト1[[1]]

[1] 3

リストの各要素に名前を付けることも可能です。名前を付けることで、後から要素にアクセスする際に便利になります。


リスト2 <- list(number = ベクトル1, vector = ベクトル2, string = ベクトル3, matrix = ベクトル4)
リスト2

$number
[1] 3

$vector
[1]  9 18 27

$string
[1] "X" "Y"

$matrix
     [,1] [,2]
[1,]    1    3
[2,]    2    4

名前付きの要素は、$ の後に要素名を書くことで取り出すことができます。データフレームの列へのアクセスと同様ですが、リストではこれは必須ではありません。データフレームは、各列が同じ長さのベクトルで構成されているため、表形式のデータ操作に向いていますが、リストはより柔軟なデータ構造を必要とする場合に適しています。


リスト2$vector

[1]  9 18 27

リストを使えば、数値、文字列、ベクトル、マトリックスといった異なるデータ型を、そのまままとめて返すことができます。例えば、Rで回帰モデルの結果を要約する 下記のような`summary()` 関数の出力結果も、実はリスト形式で提供されています。


Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  2.0000    0.2000   10.00  < 2e-16 ***
x1           1.5000    0.1500   10.00  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5 on 98 degrees of freedom
Multiple R-squared:  0.9,	Adjusted R-squared:  0.9
F-statistic: 900 on 1 and 98 DF,  p-value: < 2.2e-16

この `summary()` 関数の出力結果は、内部的には以下のような構造を持つリストとして格納されています。


summary_result <- summary(model)  # model は回帰分析で作成したモデル

この `summary_result` というリストには、`coefficients` (係数), `residuals` (残差), `r.squared` (決定係数), `fstatistic` (F統計量) などの様々な名前付き要素が含まれています。これらの要素にアクセスするには、リスト名に続けて `$` 記号と要素名を指定します。例えば、回帰係数に関する情報を取り出したい場合は、次のように書きます。


summary_result$coefficients

また、`$` 記号の代わりに、インデックス(番号)を使ってアクセスすることもできます。リストの各要素には番号が振られているため、例えば `coefficients` がリストの最初の要素であれば、次のようにアクセスできます。


summary_result[[1]]

このように、リストは名前またはインデックスを使って、内部に格納された様々なデータを柔軟に取り扱うことができる、非常に便利なデータ構造です。`summary()` 関数のように、複数の情報をまとめて返したい場合にリストは非常に役立ちます。

まとめ

この記事では、Rにおける基本的なデータ型とデータ構造について学びました。Rには論理型、整数型、実数型、文字列型、ファクター型、NAといった様々なデータ型があり、それぞれ異なる性質を持ちます。また、データを格納するための基本的なデータ構造として、ベクトル、マトリックス、データフレーム、リストがあることを解説しました。ベクトルは一次元のデータを、マトリックスは二次元のデータを格納しますが、どちらも同じデータ型の要素しか持てません。データフレームは表形式のデータを扱うのに適しており、列ごとに異なるデータ型を持つことができます。そしてリストは、異なるデータ型や長さのデータをまとめて格納できる、非常に柔軟なデータ構造です。これらの基本的なデータ型とデータ構造を理解することが後々の解析時に非常に役に立ちます。

コメント