Rベクトル:Rプログラミングの中核となるデータ構造
前回のレッスンでは、Rの6つのデータ型について学びました。今回のレッスンでは、Rの中核となるデータ構造であるベクトルについて探求していきます。Pythonでは、
1, 2, 3と入力すると3つの別々の数値が返されます。これらをリストに入れるには、[1, 2, 3]と入力する必要があります。しかし、Rは異なります。Rでは、1, 2, 3と入力するだけで、すぐにベクトルになります。
Rにおけるベクトルは、この言語全体の基礎となるものです。数値、文字列、ブール値はすべてベクトルです。このレッスンでは、ベクトルについて深く掘り下げていきます。なぜなら、それらは以降のすべてのレッスンのコードに登場するためです。
1. 学習内容
- Rベクトルとは何ですか?また、なぜそれがRの中心的な要素となっているのですか?
- ベクトルを作成する4つの方法(c() / : / seq() / rep())
- ベクトル要素へのアクセス方法 5 通り(正の整数、負の整数、ブール値、名前)
- ベクトル演算(スカラー+ベクトル、ベクトル+ベクトル)
- 9つの一般的な集計関数(sum、mean、sdなど)
- 並べ替え、重複の削除、検索といった一般的な操作
2. 学生の成績管理に関する話
(1) ミッションの背景
イワンは担任教師で、学期末には、クラスの生徒30人全員の成績を集計する必要があります。彼は以下の作業を行う必要があります:
- 平均点、最高点、および合格率を算出する
- 90点以上を獲得した生徒を特定する
- スコアを高い順に並べ替える
- 各得点に評価(優秀/良好/合格/不合格)を割り当てる
Excelを使えば、何度もコピー&ペーストを繰り返したり、ピボットテーブルを使ったりしなければなりません。Pythonを使えば、リストやループ、リスト内包表記を書いたりしなければなりません。しかし、Rを使えば――
(2) Rを用いた解決策
# One-Line Code Generation 30 Student Grades (From 50 to 100 Random)
set.seed(42)
scores <- sample(50:100, 30, replace = TRUE)
# All statistics in a single line of code
mean(scores) # Average Score
max(scores) # Highest Score
sum(scores >= 60) / length(scores) # Pass Rate
scores[scores >= 90] # 90 Points or more
sort(scores, decreasing = TRUE) # Sort in descending order
10行のコードで5つのタスクを解決。これこそがRのベクトルの魅力――最小限のコードでデータの列を処理できることなのです。
3. ベクトルとは何か?
ベクトルはRにおける最も基本的なデータ構造であり、同じ型の要素が順序付けられて集められたものです。
(1) ベクトルの性質
graph LR
A["R Vector"] --> B["Atomicity<br/>A single digit = Length1the vector"]
A --> C["Homogeneity<br/>All elements are of the same type"]
A --> D["Orderliness<br/>Index by Location 1-based"]
A --> E["Vectorization<br/>Operations are performed automatically on a per-element basis"]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
(2) RのベクトルとPythonのリストの比較
| 特性 | Rベクトル c(1,2,3) |
Pythonリスト [1,2,3] |
|---|---|---|
| 要素の種類 | 同一でなければならない | 異なることが許される |
| 可変長 | ❌ 固定 | ✅ 可変(追加・削除) |
| 算術演算 | 自動ベクトル化 | リスト内包表記が必要 |
| インデックス方式 | x[1] (1から始まる) |
x[0] (0から始まる) |
| パフォーマンス | 低レベルC言語、高速 | 汎用オブジェクト、低速 |
# Mixed Types:Mixing Numbers and Strings → Convert All to Strings
c(1, "a", TRUE)
# [1] "1" "a" "TRUE"
(3) Rには「Scalar」というものは存在しない
Rのベクトルには、ある隠れた性質があります。それは、単一の数値も長さ1のベクトルであるということです。
x <- 42
length(x)
# [1] 1
# That's why R All operations are, by default, "Vectorization"
c(1, 2, 3) + 10
# [1] 11 12 13
4. ベクトルを作成する4つの方法
(1) 作成方法の概要
| メソッド | 構文 | 使用例 |
|---|---|---|
c() |
c(1, 2, 3) |
よく使う番号をいくつか手動でリストアップする |
: |
1:5 |
連続する整数の列 |
seq() |
seq(1, 10, 2) |
等差数列 |
rep() |
rep(1:3, times = 2) |
重複する要素 |
| 文字列の連結 |
(2) 各種手法の比較
# 1. c() —— concatenate(Connect),Most Commonly Used
c(10, 20, 30, 40, 50)
# [1] 10 20 30 40 50
# 2. : —— Colon Operator,Consecutive integers
1:5
# [1] 1 2 3 4 5
5:1
# [1] 5 4 3 2 1 ← Reverse Sequence
# 3. seq() —— Arithmetic Sequence
seq(from = 1, to = 10, by = 2)
# [1] 1 3 5 7 9
seq(from = 0, to = 1, length.out = 5)
# [1] 0.00 0.25 0.50 0.75 1.00
# 4. rep() —— Duplicate Elements
rep(x = 1:3, times = 2)
# [1] 1 2 3 1 2 3 ← The entire vector is repeated 2 x
rep(x = 1:3, each = 2)
# [1] 1 1 2 2 3 3 ← Repeat each element 2 x
# 5. paste() —— String Concatenation
paste("Rank", 1:3, "th")
# [1] "Rank 1 th" "Rank 2 th" "Rank 3 th"
(3) 文字列ベクトルとpaste()
# paste Default sep = " "(Space)
paste("Hello", "World")
# [1] "Hello World"
# paste0 = paste(..., sep = "") No separators
paste0("Hello", "World")
# [1] "HelloWorld"
# Vectorized Concatenation
paste(c("a", "b", "c"), 1:3, sep = "-")
# [1] "a-1" "b-2" "c-3"
paste() と paste0() の違いは、paste0() がデフォルトで sep = "" になるため、入力する文字数が減り、30%速く入力できる点です。
5. ベクトルの要素にアクセスする5つの方法
(1) アクセス方法の概要
| メソッド | 構文 | 意味 |
|---|---|---|
| 正の整数インデックス | x[1] |
最初の要素を取得する(Rは1から始まる) |
| 負の整数インデックス | x[-1] |
先頭を除外 |
| 複数のインデックス | x[c(1, 3)] |
1番目と3番目を取る |
| 論理インデックス | x[x > 5] |
5より大きい要素を取得 |
| 名称索引 | x["Bob"] |
名称別 |
(2) ⚠️ 重要な注意点:Rは1から始まる
x <- c("a", "b", "c", "d", "e")
x[1] # 1st element
# [1] "a"
x[0] # <- Error! Empty vector, no "a"
# numeric(0)
x[c(1, 3, 5)] # Multiple indexes
# [1] "a" "c" "e"
x[0] と書いてしまいがちですが、これでは最初の要素ではなく空のベクトルが返されてしまいます。
(3) 負の整数インデックス(要素を除外)
x <- c("a", "b", "c", "d", "e")
x[-1] # Exclusion No. 1 ea
# [1] "b" "c" "d" "e"
x[-c(1, 3)] # Exclusion No. 1 and No. 3 ea
# [1] "b" "d" "e"
(4) 論理インデックス(最も強力)
これはRにおいて最も強力なインデックス作成手法です:
x <- c(10, 20, 30, 40, 50)
# Find the number greater than 30 the element
x[x > 30]
# [1] 40 50
# Find the even numbers
x[x %% 2 == 0]
# [1] 10 20 30 40 50
# Multiple conditions (& indicates "and", | indicates "or")
x[x > 20 & x < 50]
# [1] 30 40
x[logical vector] にあり、TRUE の位置は保持され、FALSE の位置は除外される。
(5) 名前付きインデックス
ベクトルの要素に名前を付け、その名前を使って要素にアクセスします:
scores <- c(Alice = 85, Bob = 92, Charlie = 78)
scores
# Alice Bob Charlie
# 85 92 78
scores["Bob"]
# Bob
# 92
6. ベクトル演算:自動ベクトル化
(1) 「ベクトル化」とは何ですか?
graph LR
A["x = 1, 2, 3"] --> C["+ 100"]
C --> D["101, 102, 103"]
E["x = 1, 2, 3"] --> F["+ y = 10, 20, 30"]
F --> G["11, 22, 33"]
style A fill:#cce5ff
style E fill:#cce5ff
style C fill:#fff3cd
style F fill:#d4edda
style D fill:#d4edda
style G fill:#d4edda
Rでの算術演算は、デフォルトで「ベクトル化」されています—ループを書く必要はありません。
(2) ベクトル + スカラー(スカラーの「ブロードキャスト」)
x <- c(1, 2, 3, 4, 5)
x + 100 # 100 Broadcast to each element
# [1] 101 102 103 104 105
x * 10
# [1] 10 20 30 40 50
(3) ベクトル + ベクトル(要素ごとの演算)
x <- c(1, 2, 3, 4, 5)
y <- c(10, 20, 30, 40, 50)
x + y
# [1] 11 22 33 44 55
x * y
# [1] 10 40 90 160 250
numpyやリスト内包表記を使用する必要がありますが、Rでは1行で処理できます。
(4) 長さが異なる場合、「ループ」が発生します
c(1, 2, 3, 4) + c(10, 20)
# Warning: longer object length is not a multiple of shorter object length
# [1] 11 22 13 24
# The Second Vector Loop:[10, 20, 10, 20]
(5) 一般的な数学関数(すべてベクトル化済み)
| 機能 | 目的 | 例 |
|---|---|---|
abs() |
絶対値 | abs(c(-1, -2, 3)) → 1 2 3 |
| 平方根 | sqrt() |
→ sqrt(c(1, 4, 9)) |
| 自然対数 | → | |
| まとめ | round() |
|
floor() ceiling() |
切り捨て/切り上げ | floor(1.6) → 1 |
7. 集計関数:ベクトルを単一の値に集約する
| 機能 | 目的 | 例 |
|---|---|---|
sum() |
合計 | sum(1:5) → 15 |
mean() |
平均値 | mean(1:5) → 3 |
median() |
中央値 | median(1:5) → 3 |
min() max() |
最小 最大 | max(1:5) → 5 |
sd() |
標準偏差 | sd(1:5) → 1.581 |
var() |
分散 | var(1:5) → 2.5 |
length() |
長さ | length(1:5) → 5 |
prod() |
製品 | prod(1:5) → 120 |
na.rm = TRUE パラメータを受け付けます:mean(c(1, 2, NA), na.rm = TRUE) → 1.5
8. 一般的な操作:並べ替え、重複の削除、検索
(1) 3つの主要な操作に関するクイックリファレンス表
| カテゴリ | 機能 | 目的 |
|---|---|---|
| ソート | sort(x) |
ソート済みベクトル |
| 並べ替え順 | order(x) |
並べ替え後のインデックス位置 |
| 並べ替え | rev(x) |
ベクトルの逆順 |
| 重複を削除 | unique(x) |
一意の値 |
| 重複データの削除 | table(x) |
頻度統計 |
| セット | union(a, b) |
ユニオン |
| セット | intersect(a, b) |
交差点 |
| 集合 | setdiff(a, b) |
差集合 |
| 検索 | match("a", x) |
最初の出現箇所 |
| 検索 | "a" %in% x |
その要素は含まれていますか? |
(2) キー:order() 対 sort()
x <- c(3, 1, 4, 1, 5, 9, 2, 6)
# sort() Return a sorted vector
sort(x)
# [1] 1 1 2 3 4 5 6 9
# order() Return the sortedIndex
order(x)
# [1] 2 4 7 1 3 8 6 5
# Meaning: x's 2nd element is the smallest and comes first, the 4th is the second smallest... After sorting x[order(x)] = sort(x)
order()は非常に一般的です。df[order(df$age), ]は年齢を昇順でソートします。
9. 完全な例:学生の成績統計
以下は、このレッスンで取り上げたすべての概念を結びつけた完全なワークフローの例です。
▶ サンプル:30人の学生の成績に関する包括的な分析
# ============================================
# Comprehensive Analysis of Student Performance
# Features: Create a grade vector, do 5 Statistics by Type
# ============================================
# 1. Create 5 Student Grades(Name Vector)
scores <- c(Alice = 85, Bob = 92, Charlie = 78, David = 95, Eve = 88)
cat("Raw Scores:\n")
print(scores)
# 2. Basic Statistics
cat("\n=== Basic Statistics ===\n")
cat("Total Score:", sum(scores), "\n")
cat("Average Score:", mean(scores), "\n")
cat("Median:", median(scores), "\n")
cat("Highest Score:", max(scores), "\n")
cat("Lowest score:", min(scores), "\n")
cat("Standard Deviation:", round(sd(scores), 2), "\n")
# 3. Find the student with the highest score(Naming Index)
cat("\n=== Top-scoring student ===\n")
print(scores[scores == max(scores)])
# 4. Find 90 Points or more
cat("\n=== 90 Students scoring above a certain score ===\n")
print(scores[scores >= 90])
# 5. Identify the failing grades
cat("\n=== Students who failed(< 60)===\n")
print(scores[scores < 60])
# 6. Sort (descending)
cat("\n=== Sort by score in descending order ===\n")
print(sort(scores, decreasing = TRUE))
# 7. Standardization(z-score:Subtract the mean from all scores, then divide by the standard deviation)
z_scores <- (scores - mean(scores)) / sd(scores)
cat("\n=== Z-Score Standardization ===\n")
print(round(z_scores, 3))
# 8. Rating(Excellent/Good/Passing Grade/Fail)
ratings <- ifelse(scores >= 90, "Excellent",
ifelse(scores >= 80, "Good",
ifelse(scores >= 60, "Passing Grade", "Fail")))
cat("\n=== Rating ===\n")
print(data.frame(Fractions = scores, Rating = ratings))
期待される出力(抜粋):
Raw Scores:
Alice Bob Charlie David Eve
85 92 78 95 88
=== Basic Statistics ===
Total Score: 438
Average Score: 87.6
Median: 88
Highest Score: 95
Lowest score: 78
Standard Deviation: 6.19
=== 90 Students scoring above a certain score ===
David
95
=== Sort by score in descending order ===
David Bob Alice Eve Charlie
95 92 85 88 78
=== Z-Score Standardization ===
Alice Bob Charlie David Eve
-0.420 0.711 -1.551 1.197 -0.097
(1) 手順
| ステップ | 操作 | 説明 |
|---|---|---|
| 1 | RStudioプロジェクトの作成 r-vectors |
File → New Project |
| 2 | 新しいスクリプト score_analysis.R を作成 |
上記のコードをコピー |
| 3 | すべて選択 → Ctrl+Enter |
コンソールに送信 |
| 4 | 出力を確認する | 6つの統計結果を確認する |
❓ よくある質問
x[0] と記述するものの、結果として空のベクトル numeric(0) になってしまうのです。c(1,2,3,4,5,6) を2×3の行列に変換すると、matrix(1:6, nrow = 2) になります)。📖 まとめ
- ベクトルはRにおける最も基本的なデータ構造であり、同じ型の要素が順序付けられて集められたものです。Rには「スカラー」という概念はなく、単一の数値は単に長さ1のベクトルにすぎません。
- 生成方法:直接列の場合は
c()、整数の数列の場合は:、等差数列の場合はseq()、繰り返し列の場合はrep()を使用します。文字列の連結にはpaste()またはpaste0()を使用します。 - 4つのインデックス指定方法:正の整数(1から始まる、
x[0]は空のベクトル)、負の整数(除外)、論理ベクトル(フィルタリング)、名前付きインデックス(名前による指定) - 算術演算は自動的にベクトル化される(ベクトル+スカラー、ベクトル+ベクトル)ため、ループを記述する必要はありません。また、一般的な数学関数(sqrt、log、exp)も要素ごとに処理されます。
- 集計関数 (
sum()mean()sd()median()) はベクトルを単一の値に集約します。これらはすべて、NA値をスキップするna.rm = TRUEに対応しています。 - ソートには
sort()/order()(order はインデックスを返す)、重複排除にはunique()、頻度分析にはtable()、集合処理にはunion/intersect/setdiff、検索にはmatch()/%in%を使用してください
📝 練習問題
-
基本問題:①
c()、②:、③seq()の3つの異なる方法を用いて、1から10までの整数のベクトルを作成してください。また、identical()を使用して、これら3つの結果が完全に一致することを確認してください。コンソールの出力をスクリーンショットに撮り、保存してください。 -
基本的な問題:ベクトル
x <- c(2, 4, 6, 8, 10)を作成し、論理インデックス を使用して 5 より大きい要素を抽出し、フィルタリングされたベクトルを出力してください。コードと出力のスクリーンショットを保存してください。 -
基本演習:
paste()とpaste("Rank", 1:5, "th", sep = "")を連結し、その結果を記録します。次に、paste0()とpaste0("x", 1:5, "y")を連結し、その結果を記録します。スクリーンショットを撮り、保存してください。 -
応用問題:10人の生徒の得点をシミュレートする:①
sample(60:100, 10)を使用して得点をランダムに生成する;② 平均、中央値、最高得点、最低得点、標準偏差を計算する;③which.max()を使用して、最高得点の生徒の順位を求める;④ 合格者(60点以上)の人数を数える。各ステップの出力のスクリーンショットを保存してください。 -
課題:「生徒のクラス分け」のシナリオをシミュレートするスクリプトを作成してください。① 10人の生徒の名前を含むベクトル
names <- c("Alice", "Bob", ...)を作成します。② 10個の得点を含むベクトルscores <- sample(60:100, 10)を作成します。③ それをnames(scores) <- namesと名付けます。④ 90点以上を獲得した生徒の名前を抽出する;⑤ 不合格となった生徒の名前を抽出する;⑥ それらを昇順に並べ替え、sort(scores)を使用して出力する。スクリプトを実行した後、スクリーンショットを撮り、コンソールの出力全体を保存してください。



