scores <- c(45, 23, 67, 12, 89, 34, 56)
# 条件指定でインデキシング
scores[scores >= 30]U4. 基本的なデータ操作
ユニット概要
分類: 幹(全員必須)
依存関係: U0 → U1 → U2 → U4
学習目標:
- 算術演算子、比較演算子、論理演算子を使い分けられる
[]を使ったインデキシング(位置指定・条件指定・名前指定)ができるsort()やorder()でデータを並べ替えられるwhich()で条件を満たす位置を取得できるlength(),nrow(),ncol()でオブジェクトのサイズを確認できる
事前知識: データ操作の基本パーツ
演算子の種類
Rの演算子は大きく3種類あります。
算術演算子(計算に使う):
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
+ |
加算 | 3 + 2 |
5 |
- |
減算 | 3 - 2 |
1 |
* |
乗算 | 3 * 2 |
6 |
/ |
除算 | 7 / 2 |
3.5 |
^ |
冪乗 | 2^3 |
8 |
%% |
剰余(余り) | 7 %% 3 |
1 |
%/% |
整数除算 | 7 %/% 3 |
2 |
比較演算子(条件判定に使う。結果はTRUE/FALSE):
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
== |
等しい | 3 == 3 |
TRUE |
!= |
等しくない | 3 != 4 |
TRUE |
> |
より大きい | 5 > 3 |
TRUE |
< |
より小さい | 5 < 3 |
FALSE |
>= |
以上 | 3 >= 3 |
TRUE |
<= |
以下 | 3 <= 2 |
FALSE |
論理演算子(条件を組み合わせる):
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
& |
かつ(AND) | TRUE & FALSE |
FALSE |
| |
または(OR) | TRUE | FALSE |
TRUE |
! |
否定(NOT) | !TRUE |
FALSE |
インデキシング
ベクトルやデータフレームの要素にアクセスするには[](大括弧)を使います。指定方法は3通りあります:
x <- c(10, 20, 30, 40, 50)
x[3] # 位置指定: 3番目の要素 → 30
x[c(1, 4)] # 複数位置: 1番目と4番目 → 10 40
x[x > 25] # 条件指定: 25より大きい要素 → 30 40 50
x[-2] # 除外: 2番目以外 → 10 30 40 50条件指定の仕組みは、x > 25がFALSE FALSE TRUE TRUE TRUEという論理ベクトルを返し、TRUEの位置の要素だけが取り出される、というものです。
データフレームの場合は[行, 列]の形で指定します:
df[3, ] # 3行目の全列
df[, 2] # 全行の2列目
df[1:5, c("name", "score")] # 1〜5行目のname列とscore列並べ替え
x <- c(30, 10, 50, 20, 40)
sort(x) # 昇順に並べ替え → 10 20 30 40 50
sort(x, decreasing = TRUE) # 降順 → 50 40 30 20 10
order(x) # 昇順に並べるための位置 → 2 4 1 5 3sort()は値そのものを並べ替えますが、order()は「何番目の要素を先に取れば昇順になるか」という位置を返します。データフレームの行を並べ替えるときはorder()が便利です。
ランクC: 基礎知識を確認しよう
4-C-1
7 %% 3の結果は何ですか?
%%は剰余(余り)を返す演算子です。7を3で割ると商は2、余りは1です。整数除算%/%なら7 %/% 3は2を返します。
4-C-2
3 == 3の結果はどれですか?
==は比較演算子で、左右が等しいかどうかを判定します。等しいのでTRUEが返ります。=(1つ)は代入なので、条件判定には必ず==を使ってください。
4-C-3
TRUE & FALSEの結果はどれですか?
&はAND演算子で、両方ともTRUEのときだけTRUEを返します。片方でもFALSEなら結果はFALSEです。「かつ」と読みます。
4-C-4
次のコードの結果はどうなりますか?
x <- c(10, 20, 30, 40, 50)
x[c(2, 4)]x[c(2, 4)]はxの2番目と4番目の要素を取り出します。x[2]は20、x[4]は40なので、結果は20 40です。
4-C-5
次のコードの結果はどうなりますか?
x <- c(10, 20, 30, 40, 50)
x[x > 25]x > 25はFALSE FALSE TRUE TRUE TRUEという論理ベクトルを返します。x[c(FALSE, FALSE, TRUE, TRUE, TRUE)]と同じで、TRUEに対応する要素だけが取り出されます。
4-C-6
sort()とorder()の違いは何ですか?
x <- c(30, 10, 50)
sort(x) # 10 30 50(値そのもの)
order(x) # 2 1 3(2番目→1番目→3番目の順で取ると昇順になる)データフレームの行を並べ替えるときはorder()を使います:df[order(df$score), ]
4-C-7
次のコードでx[-3]は何を返しますか?
x <- c(10, 20, 30, 40, 50)
x[-3]マイナスをつけると、その位置の要素を除外した残りを返します。x[-3]は3番目(30)を除いた10 20 40 50です。元のベクトルxは変更されません。
4-C-8
which()関数は何を返しますか?
x <- c(10, 20, 30, 40, 50)
which(x > 25) # 3 4 5(3番目、4番目、5番目が条件を満たす)
x[x > 25] # 30 40 50(条件を満たす値そのもの)which()は「どこにあるか」を返します。x[x > 25]は「何があるか」を返します。
4-C-9
length()関数はベクトルの何を返しますか?
length()はベクトルの要素数を返します。データフレームに対しては列数を返します。行数を知りたい場合はnrow()を使います。
x <- c(10, 20, 30)
length(x) # 3
df <- data.frame(a = 1:5, b = 6:10)
length(df) # 2(列数)
nrow(df) # 5(行数)
ncol(df) # 2(列数)4-C-10
%in%演算子は何をしますか?
x <- c("A", "B", "C", "D")
x %in% c("B", "D") # FALSE TRUE FALSE TRUExの各要素がc("B", "D")に含まれるかどうかをTRUE/FALSEで返します。filter()や条件指定で複数の値と一致するか調べるときに便利です。
ランクB: 実践スキルを磨こう
4-B-1
次のベクトルから、30以上の値だけを取り出してください。
scores <- c(45, 23, 67, 12, 89, 34, 56)結果:45 67 89 34 56
scores >= 30がTRUE FALSE TRUE FALSE TRUE TRUE TRUEという論理ベクトルを返し、TRUEの位置の要素が取り出されます。
4-B-2
次のベクトルを昇順と降順に並べ替えてください。
x <- c(50, 20, 80, 10, 40)x <- c(50, 20, 80, 10, 40)
sort(x) # 昇順: 10 20 40 50 80
sort(x, decreasing = TRUE) # 降順: 80 50 40 20 104-B-3
次のベクトルで、偶数だけを取り出してください。
nums <- 1:20偶数は2で割った余りが0です。%%演算子を使います。
nums <- 1:20
nums[nums %% 2 == 0]結果:2 4 6 8 10 12 14 16 18 20
nums %% 2 == 0は各要素を2で割った余りが0かどうかを判定します。
4-B-4
次のデータフレームで、scoreが80以上の行だけを取り出してください。[]を使ってください(dplyrのfilter()は使わないこと)。
df <- data.frame(
name = c("太郎", "花子", "次郎", "美咲", "健太"),
score = c(85, 72, 91, 68, 88)
)df[条件, ]の形で行を絞り込めます。条件にはdf$score >= 80のように論理ベクトルを指定します。
df <- data.frame(
name = c("太郎", "花子", "次郎", "美咲", "健太"),
score = c(85, 72, 91, 68, 88)
)
df[df$score >= 80, ]結果:太郎(85)、次郎(91)、健太(88)の3行が返ります。カンマの後ろを空にすると全列が選択されます。
4-B-5
4-B-4のデータフレームをscoreの降順に並べ替えてください。
order()を使います。order(df$score, decreasing = TRUE)で降順の位置が得られるので、それで行を並べ替えます。
df[order(df$score, decreasing = TRUE), ]結果:次郎(91) → 健太(88) → 太郎(85) → 花子(72) → 美咲(68) の順に並びます。order()はデータフレームの行並べ替えに欠かせない関数です。
4-B-6
irisデータセットで、Sepal.Lengthが7以上 かつ Speciesが"virginica"であるケースを[]で取り出してください。何行ありますか?
2つの条件を&で結びます。行数はnrow()で確認できます。
result <- iris[iris$Sepal.Length >= 7 & iris$Species == "virginica", ]
result
nrow(result)&で2つの条件を組み合わせています。結果は12行です。|(OR)を使えば「いずれかを満たす」条件になります。
4-B-7
次のベクトルで、NAでない値だけを取り出してください。
x <- c(10, NA, 30, NA, 50, 60, NA)is.na()関数はNAの位置にTRUEを返します。!で否定すると「NAでない」になります。
x <- c(10, NA, 30, NA, 50, 60, NA)
x[!is.na(x)]結果:10 30 50 60
is.na(x)はFALSE TRUE FALSE TRUE FALSE FALSE TRUEを返し、!で反転させてTRUE FALSE TRUE FALSE TRUE TRUE FALSEにしてからインデキシングしています。
ランクA: AI協働に挑戦しよう
4-A-1
課題: irisデータセットから以下の条件を満たすケースを[]だけで(dplyrを使わずに)取り出してください。
Speciesが"setosa"ではないPetal.Lengthが4以上Sepal.Widthが3未満
条件が複雑になるので、AIに相談しながら正しい論理式を組み立ててください。結果が何行になるかも確認してください。
提出物: AIとの対話ログ、完成したコード、結果の行数。
4-A-2
課題: BaseballDecade.csvを読み込み、dplyrを使わずに[]と基本関数だけで以下を行ってください。
- 2020年度のデータだけに絞る
- 年俸(salary)の降順に並べ替える
- 上位10人の名前と年俸を表示する
AIに相談しながら進めてください。dplyrのfilter(), arrange(), head()に相当する操作を、[]とorder()で実現することがポイントです。
提出物: AIとの対話の記録、完成したコード。
まとめ
このユニットでは、Rの基本的なデータ操作を学びました:
- 算術演算子:
+,-,*,/,^,%%,%/% - 比較演算子:
==,!=,>,<,>=,<= - 論理演算子:
&(AND),|(OR),!(NOT) - インデキシング:
[]で位置・条件・名前による要素アクセス - 並べ替え:
sort()で値を、order()で位置を取得 - 便利な関数:
which(),length(),nrow(),ncol(),%in%
これらはdplyr(U7)のfilter()やselect()の裏側で動いている基本操作です。dplyrを使えば多くの場面でこれらを直接書く必要はありませんが、仕組みを理解しておくとエラーの原因を特定しやすくなります。
次のユニット: U5. データの読み込みと書き出しでは、CSVやExcelファイルの読み書きを学びます。
進捗: あなたは今 4-C-10 まで完了しました!(と仮定)次は 4-B-1 に進みましょう。