0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【都市・観光情報学でのRマニュアル】2 データ構造

Last updated at Posted at 2025-11-23

ご挨拶

今回の記事も、大規模なデータ処理のための基礎知識編のつもりです。

※独学の部分も多いので、修正点等あればお気軽にコメントでのご指摘をお願いします……。

前の記事はコチラ
【都市・観光情報学でのRマニュアル】1 データ型

データ構造とは

複数の値を格納する「入れ物」をデータ構造と言う。Rではデータ構造の種類によって格納できるデータ型や操作方法が異なる。

・ ベクトル(vector)

同一データ型の要素を並べた1次元配列。
基本データ型(numeric, integer, logical, complex, character, raw)しか代入できない。

#ベクトルの作り方(よく使うやつ)
a <- numeric(4)
a
# [1] 0 0 0 0

name <- c("Tanaka", "Satou", "Yamada")
name
# [1] "Tanaka" "Satou"  "Yamada"

・ 因子(factor)

character型のデータをカテゴリデータ(名義尺度・順序尺度で表されるデータ)として扱えるようになる。
因子化しておくと、統計解析を行う際に文字列の見た目のまま変数として扱えるため、使用頻度は多い。

# 文字列(名義尺度) → 因子
factors <- factor(c("Tokyo", "Chiba", "Chiba", "Tokyo", "Kanagawa"))
factors
# [1] Tokyo    Chiba    Chiba    Tokyo    Kanagawa
# Levels: Chiba Kanagawa Tokyo

# 文字列(順序尺度) → 因子
gakureki <- factor(c("大卒", "大卒", "修士", "高卒", "高卒", "大卒", "高卒"),
                   levels = c("中卒", "高卒", "大卒", "修士"),
                   ordered = TRUE)
gakureki
# [1] 大卒 大卒 修士 中卒 高卒 大卒 高卒
# Levels: 中卒 < 高卒 < 大卒 < 修士

補足
内部的には「文字列のベクトル」を「ラベル+整数のベクトル」として扱うため、重複の多い文字列を扱う際はメモリ効率が良くなる。

・ 行列(matrix)

同一データ型の要素を行×列に並べた2次元配列。
線形代数における行列と同じで、要素が数値の場合は行列計算(加算・乗算・転置など)も可能。

# 行列の作成
m <- matrix(1:6, nrow = 2, ncol = 3)
m
#      [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6

# 行列操作(例:転置)
t(m)
#      [,1] [,2]
# [1,]    1    2
# [2,]    3    4
# [3,]    5    6

・ データフレーム(data.frame)

異なるデータ型の列を持つ表形式の構造。
列ごとに列名やデータ型を指定することができ、統計解析やデータ整理などで多用する。
(個人的には、文法の柔軟性や処理速度に優れたデータテーブル(data.table)の利用がおすすめ)

# data.frameの作成
df <- data.frame(id = 1:3, nema = c("Tanaka", "Satou", "Yamada"))
df
#   id   nema
# 1  1 Tanaka
# 2  2  Satou
# 3  3 Yamada
 
# id列の抽出
df$id
# [1] 1 2 3

・ リスト(list)

異なるデータ型の要素をまとめて格納できる。また、データ構造を格納して入れ子構造にすることも出来る。
かなり柔軟な運用ができるので使いどころは非常に多い。

# リストの作成
list_ex <- list(num = c(1:3),
                char = "Tokyo",
                df = data.frame(x = c(1, 2), y = c("a", "b")))

# リストの要素にアクセス
# 要素名でアクセス
list_ex$num
# [1] 1 2 3

list_ex[["char"]]
# [1] "Tokyo"
 
# 順番でアクセス
list_ex[[3]]
#   x y
# 1 1 a
# 2 2 b

1 - (2) まとめ

  • Rで複数の値を同時に扱うときは、データ構造という「入れ物」に格納してから処理することになる。
    ベクトル
     同じ型のデータを1列に並べたいとき
    リスト
     異なる方や構造を1つにまとめたいとき
    データフレーム
     表形式で「列=属性」×「行=レコード」にまとめたいとき
    入れ物ごとに格納できるデータ型や処理方法が変わってくるため、データの形式や行いたい処理に合わせて入れ物選びが肝心。

  • データを追加する際は主に

    1. 既存のデータ構造の末尾に新しいデータ(レコード)を追加する
    2. 空のベクトル・リストを作成しておいて、後からアドレスを指定して格納する

    の2通りの方法がある。
    実務的な面では、2の方がメモリに負荷がかからず処理速度が速い。

  • 実際に表形式のデータを扱う際は'data.table'を利用することが強く推奨される。

補足
ベクトルやデータフレームは処理の度にデータをコピー&新規作成する仕組みが多く、データサイズが大きいとメモリ効率が悪化する。一方で、data.tableは追加・更新が参照ベースで行われ、速度とメモリ効率が大幅に改善される。

登場した関数

・ 引数をベクトルにまとめる関数

c(x, )
引数 説明
x 格納するデータ。複数指定可能。

Tips
異なる方を同時に引数とした場合、最も幅の広いデータ型に自動変換される

vec <- c(3, 4L, "5")

class(vec)
# [1] "character"

Tips
基地のベクトルを結合して新しいベクトルを作ることも可能(= データの追加)

vec1 <- c(1:3)
vec2 <- c(4:5)

# vec1とvec2を結合する
vec3 <- c(vec1, vec2)
vec3
# [1] 1 2 3 4 5

・ 空の数値ベクトルを作成する関数

要素は全て0になる。

numeric(length)
引数 説明
length 生成するベクトルの長さ。省略した場合0

Tips
空ベクトルを作成してから、あとでアドレスを指定してデータを追加していく方法

# まずは空ベクトルを作成
vec <- numeric(4)
vec
# [1] 0 0 0 0

# i番目の要素にi×2を格納
for (i in 1:4) {
  vec[i] <- i * 2
}
vec
# [1] 2 4 6 8

・ 因子型データを作成する関数

使い方は因子(factor)を参照

factor(x, levels, labels, exclude, ordered, nmax)
引数 説明
x 因子に変換したいベクトル
levels 水準を指定。省略時にはunique(x)(重複を削除したxの要素)の順序になる。
labels levelにたいして表示するときの見た目の名前を指定
exclude 除外する値を指定。省略時はNA
ordered 順序付き因子にするかをTRUE/FALSEで指定。省略時にはFALSE
nmax 内部的な引数なので指定不要

・ 行列を作成する関数

matrix(data, nrow, ncol, byrow, dimnames)
引数 説明
data 行列に変換したいベクトル
nrow 行数(整数のみ)
ncol 列数(整数のみ)
byrow ベクトルを行単位で詰めていくかをTRUE/FALSEで指定。省略時にはFALSE
dimnames 行名・列名をリスト形式で指定可能(あんまり使わない)

Tips
デフォルトでは列ごとに要素が埋まっていく

# デフォルト(列ごとに埋まっていく)
m <- matrix(c(1:6), nrow = 3, ncol = 2)
m
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

# byrow = TRUEに設定(行ごとに埋まっていく)
m <- matrix(c(1:6), nrow = 3, ncol = 2, byrow = TRUE
m
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

・ データフレームを作成する関数

使い方はデータフレーム(data.frame)を参照。

data.frame(col.nemes = data, 
           row.names, 
           check.rows, 
           check.names,
           fix.empty.names, 
           stringsAsFactors)
引数 説明
col.names = data データフレームに格納したいベクトル。col.namesに文字列を入れることで列名の指定が可能(省略可)
row.names 行名を指定。省略時は自動で1, 2, ...と割り振られる。
check.rows 列ごとに行数が一致しているかの確認をするかをTRUE/FALSEで指定。省略時はTRUE
fix.empty.names 空の列名を自動で補完するかをTRUE/FALSEで指定。省略時はTRUE
stringAsFactor 文字列を因子型にするかをTRUE/FALSEで指定。省略時はFALSE

・ リストを作成する関数

使い方はリスト(list)を参照。

list(col.names = data, ...)
引数 説明
col.names = data リストに格納したいオブジェクト(複数指定可能)。col.namesの部分に文字列を入れることで列名の指定が可能(省略可)

次の投稿

Rの基本構文予約語について書くと思います。

> 書きました。
【都市・観光情報学でのRマニュアル】3 Rの基本構文

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?