404 Not Found

404 Not Found


nginx

Rベクトル:Rプログラミングの中核となるデータ構造

前回のレッスンでは、Rの6つのデータ型について学びました。今回のレッスンでは、Rの中核となるデータ構造であるベクトルについて探求していきます。Pythonでは、1, 2, 3と入力すると3つの別々の数値が返されます。これらをリストに入れるには、[1, 2, 3]と入力する必要があります。しかし、Rは異なります。Rでは、1, 2, 3と入力するだけで、すぐにベクトルになります

Rにおけるベクトルは、この言語全体の基礎となるものです。数値、文字列、ブール値はすべてベクトルです。このレッスンでは、ベクトルについて深く掘り下げていきます。なぜなら、それらは以降のすべてのレッスンのコードに登場するためです。

1. 学習内容



2. 学生の成績管理に関する話

(1) ミッションの背景

イワンは担任教師で、学期末には、クラスの生徒30人全員の成績を集計する必要があります。彼は以下の作業を行う必要があります:

Excelを使えば、何度もコピー&ペーストを繰り返したり、ピボットテーブルを使ったりしなければなりません。Pythonを使えば、リストやループ、リスト内包表記を書いたりしなければなりません。しかし、Rを使えば――

(2) Rを用いた解決策

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) ベクトルの性質

100%
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言語、高速 汎用オブジェクト、低速
⚠️ 注意Rベクトルのすべての要素は同じ型でなければなりません。型が混在している場合、Rはそれらを「最も広い」型に自動的にキャストします:

R
# Mixed Types:Mixing Numbers and Strings → Convert All to Strings
c(1, "a", TRUE)
# [1] "1" "a" "TRUE"
💡 ヒント:これが R と Python のリストの 最大の違い です。R のベクトルは 同種 ですが、Python のリストは 異種 です。異なる型のデータを格納するには、リスト (list()) を使用します(第 9 課で解説します)。

(3) Rには「Scalar」というものは存在しない

Rのベクトルには、ある隠れた性質があります。それは、単一の数値も長さ1のベクトルであるということです。

R
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) 各種手法の比較

R
# 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()

R
# 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から始まる

R
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"
⚠️ 注意:これはRで最もよくある落とし穴の一つです。Pythonから移行してきた初心者は、無意識のうちに x[0] と書いてしまいがちですが、これでは最初の要素ではなく空のベクトルが返されてしまいます

(3) 負の整数インデックス(要素を除外)

R
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において最も強力なインデックス作成手法です:

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) 名前付きインデックス

ベクトルの要素に名前を付け、その名前を使って要素にアクセスします:

R
scores <- c(Alice = 85, Bob = 92, Charlie = 78)
scores
#   Alice      Bob   Charlie
#      85       92       78

scores["Bob"]
# Bob
#  92


6. ベクトル演算:自動ベクトル化

(1) 「ベクトル化」とは何ですか?

100%
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) ベクトル + スカラー(スカラーの「ブロードキャスト」)

R
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) ベクトル + ベクトル(要素ごとの演算)

R
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
💡 ヒント:これは、Pythonに比べてRが持つ大きな利点の一つです。Pythonでは、2つのリストを結合するにはnumpyやリスト内包表記を使用する必要がありますが、Rでは1行で処理できます。

(4) 長さが異なる場合、「ループ」が発生します

R
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]
⚠️ 注意長さが互いに整数の倍数でない場合警告が表示されます。この種のバグはRでは非常に一般的ですので、コードを書く際は2つのベクトルの長さが同じであることを確認してください

(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値をスキップするための 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()

R
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人の学生の成績に関する包括的な分析

R
# ============================================
# 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))
▶ 試してみよう

期待される出力(抜粋):

R
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つの統計結果を確認する

❓ よくある質問

Q なぜRのインデックスは0ではなく1から始まるのですか?
A Rは数学者によって設計されており、数学の慣例に従っています(ベクトルの要素は1から番号が振られます)。これは、RとPython/Java/Cとの最大の違いの一つです。初心者はよくこの罠に陥ります。最初の要素を取得しようとして x[0] と記述するものの、結果として空のベクトル numeric(0) になってしまうのです。
Q ベクトルと行列の関係はどのようなものですか?
A 行列はベクトルの「2次元版」であり、行と列に整理されたものです(1次元のベクトル c(1,2,3,4,5,6) を2×3の行列に変換すると、matrix(1:6, nrow = 2) になります)。

📖 まとめ


📝 練習問題

  1. 基本問題:① c()、② :、③ seq() の3つの異なる方法を用いて、1から10までの整数のベクトルを作成してください。また、identical() を使用して、これら3つの結果が完全に一致することを確認してください。コンソールの出力をスクリーンショットに撮り、保存してください。

  2. 基本的な問題:ベクトル x <- c(2, 4, 6, 8, 10) を作成し、論理インデックス を使用して 5 より大きい要素を抽出し、フィルタリングされたベクトルを出力してください。コードと出力のスクリーンショットを保存してください。

  3. 基本演習paste()paste("Rank", 1:5, "th", sep = "") を連結し、その結果を記録します。次に、paste0()paste0("x", 1:5, "y") を連結し、その結果を記録します。スクリーンショットを撮り、保存してください。

  4. 応用問題:10人の生徒の得点をシミュレートする:① sample(60:100, 10) を使用して得点をランダムに生成する;② 平均、中央値、最高得点、最低得点、標準偏差を計算する;③ which.max() を使用して、最高得点の生徒の順位を求める;④ 合格者(60点以上)の人数を数える。各ステップの出力のスクリーンショットを保存してください。

  5. 課題:「生徒のクラス分け」のシナリオをシミュレートするスクリプトを作成してください。① 10人の生徒の名前を含むベクトル names <- c("Alice", "Bob", ...) を作成します。② 10個の得点を含むベクトル scores <- sample(60:100, 10) を作成します。③ それを names(scores) <- names と名付けます。④ 90点以上を獲得した生徒の名前を抽出する;⑤ 不合格となった生徒の名前を抽出する;⑥ それらを昇順に並べ替え、sort(scores) を使用して出力する。スクリプトを実行した後、スクリーンショットを撮り、コンソールの出力全体を保存してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%