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 > 25FALSE 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 3

sort()は値そのものを並べ替えますが、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 > 25FALSE 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 TRUE

xの各要素がc("B", "D")に含まれるかどうかをTRUE/FALSEで返します。filter()や条件指定で複数の値と一致するか調べるときに便利です。


ランクB: 実践スキルを磨こう

4-B-1

次のベクトルから、30以上の値だけを取り出してください。

scores <- c(45, 23, 67, 12, 89, 34, 56)
scores <- c(45, 23, 67, 12, 89, 34, 56)

# 条件指定でインデキシング
scores[scores >= 30]

結果:45 67 89 34 56

scores >= 30TRUE 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 10

4-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を使わずに[]と基本関数だけで以下を行ってください。

  1. 2020年度のデータだけに絞る
  2. 年俸(salary)の降順に並べ替える
  3. 上位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 に進みましょう。