0Pricing
R Academy · レッスン

列によるデータフレームの並べ替え

order()とdplyrのarrange()を使ってデータフレーム全体を並べ替えます。

「列によるデータフレームの並べ替え」はCoddyKit上の無料R Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

1列を基準にデータフレームをソートする

データフレームをソートする標準的なbase Rの方法は、対象列に対してorder()を使い、得られたインデックスで行を並べ替えることです。インデックスの後ろにあるカンマは、すべての列を選択することを示します。

df <- data.frame(
  name = c('Charlie', 'Alice', 'Bob', 'Diana'),
  age  = c(35, 28, 42, 31),
  salary = c(55000, 48000, 72000, 61000)
)
df[order(df$age), ]

符号反転による降順ソート

数値列では、order()の中で列の符号を反転すると、ソート方向を逆にできます。マイナス記号によってすべての値が反転するため、元の最大値が並べ替え上は最小値になります。

df <- data.frame(
  name   = c('Charlie', 'Alice', 'Bob', 'Diana'),
  salary = c(55000, 48000, 72000, 61000)
)
# Highest salary first
df[order(-df$salary), ]

複数列のソート

order()に複数の列を渡すと、主条件、次に副条件の順でソートできます。2番目の引数が、1番目の引数で同順位になった要素の順序を決めます。これはSQLのORDER BY col1, col2に相当します。

df <- data.frame(
  dept   = c('Eng', 'HR', 'Eng', 'HR', 'Eng'),
  name   = c('Zara', 'Bob', 'Alice', 'Eve', 'Mike'),
  salary = c(90000, 55000, 85000, 58000, 78000)
)
# Sort by dept, then by salary descending within dept
df[order(df$dept, -df$salary), ]

文字列列のソート

文字列列によるソートも同じ方法で行えます。order()が辞書順の並べ替えを処理します。アルファベットの逆順にするには、符号反転ではなくdecreasing = TRUEを使います(符号反転が使えるのは数値だけです)。

df <- data.frame(
  city    = c('Paris', 'Athens', 'Berlin', 'London'),
  pop_mil = c(2.1, 0.6, 3.6, 9.0)
)
# Alphabetical by city
df[order(df$city), ]
# Reverse alphabetical
df[order(df$city, decreasing = TRUE), ]

ソート後に行番号をリセットする

ソート後も、行名には元の位置(例:3、1、4、2)が反映されます。1から始まる連続した整数に戻すには、row.names(df) <- NULLを設定するか、結果をdata.frame()でラップします。

df <- data.frame(
  x = c(30, 10, 20),
  y = c('c', 'a', 'b')
)
sorted <- df[order(df$x), ]
cat('Before reset:\n'); print(sorted)
row.names(sorted) <- NULL
cat('After reset:\n');  print(sorted)

NA値を含むソート

ソート対象の列にNAが含まれる場合、デフォルトではorder()がそれらを末尾に配置します。na.last = FALSEを使うとNAの行を先頭に移動できます。先に除外しておく方法もあります。

df <- data.frame(
  name  = c('Alice', 'Bob', 'Carol', 'Dave'),
  score = c(85, NA, 92, NA)
)
cat('NAs last (default):\n')
print(df[order(df$score), ])
cat('NAs first:\n')
print(df[order(df$score, na.last = FALSE), ])

現代的な代替手段としてのdplyr::arrange()

dplyrパッケージには、より簡潔な代替手段としてarrange()があります。dplyrはbase Rではありませんが、構文を知っておくと現代的なRコードを読みやすくなります。注:ここでisRunnableがtrueなのは構文を示すためだけです。実行するにはdplyrをインストールする必要があります。

# dplyr::arrange() syntax (requires dplyr installed)
# library(dplyr)
# df |> arrange(salary)           # ascending
# df |> arrange(desc(salary))     # descending
# df |> arrange(dept, desc(salary)) # multi-column

# Equivalent base R:
df <- data.frame(dept=c('A','B','A'), salary=c(50,70,60))
df[order(df$dept, -df$salary), ]

レベル順による因子のソート

因子列はアルファベット順ではなく、レベルの順序でソートされます。ソート前に因子レベルを明示的に設定すると、独自のソート順を定義できます。

df <- data.frame(
  priority = factor(c('Low', 'High', 'Medium', 'High', 'Low'),
                    levels = c('Low', 'Medium', 'High')),
  task = c('T1', 'T2', 'T3', 'T4', 'T5')
)
# Sorts by factor level (Low < Medium < High)
df[order(df$priority), ]

ソートして上位の行を選択する

よく使われるパターンは、データフレームをソートしてからhead()で上位N行を取得する方法です。下位N行を取得するにはtail()を使います。これはSQLのORDER BY ... LIMIT Nに相当するbase Rの方法です。

df <- data.frame(
  product = c('A', 'B', 'C', 'D', 'E'),
  revenue = c(1200, 4500, 890, 3100, 2750)
)
# Top 3 by revenue
top3 <- head(df[order(-df$revenue), ], 3)
row.names(top3) <- NULL
print(top3)

その場でのソートと代入するソート

ソートしても元のデータフレームは変更されず、新しいデータフレームが返されます。結果は必ず変数に代入してください(新しい変数に代入しても、元の変数を上書きしてもかまいません)。ソート前の状態が不要になった場合は、元のデータフレームを上書きしても問題ありません。

df <- data.frame(
  x = c(3, 1, 4, 1, 5, 9),
  y = c('c', 'a', 'd', 'b', 'e', 'i')
)
# Safe: assign to new variable
df_sorted <- df[order(df$x), ]
# Or overwrite original:
df <- df[order(df$x), ]
row.names(df) <- NULL
print(df)

ソートの完全なワークフロー

ここでは、現実的なデータフレームのソート手順を一通り示します。従業員を部署名の昇順、次に給与の降順でソートし、行インデックスをリセットして、結果を見やすく表示します。

employees <- data.frame(
  name   = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
  dept   = c('IT', 'HR', 'IT', 'HR', 'IT'),
  salary = c(85000, 58000, 92000, 63000, 78000)
)
result <- employees[order(employees$dept, -employees$salary), ]
row.names(result) <- NULL
print(result)

確認問題

base Rを使って、データフレームdfを数値列df$salaryの降順でソートするには、どうすればよいですか。

データフレームのソート:要点

データフレームのソートの要点:

  • base Rの慣用表現:df[order(df$col), ]
  • 数値の降順:order(-df$col)のようにorder()内で-を使って符号を反転します
  • 文字列の降順:decreasing = TRUE引数を使います
  • 複数列:order(df$a, df$b)。副条件で同順位を解消します
  • 因子はアルファベット順ではなく、定義されたレベル順でソートされます
  • ソート後はrow.names(df) <- NULLで行名をリセットします
  • 現代的な代替手段:降順にはdesc()を使うdplyr::arrange()
df <- data.frame(
  name = c('Zara', 'Ana', 'Bob', 'Ana'),
  score = c(90, 85, 92, 88)
)
# Sort by name asc, score desc
result <- df[order(df$name, -df$score), ]
row.names(result) <- NULL
print(result)

よくある質問

「列によるデータフレームの並べ替え」レッスンは無料ですか?

はい。「列によるデータフレームの並べ替え」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「列によるデータフレームの並べ替え」で何を学びますか?

order()とdplyrのarrange()を使ってデータフレーム全体を並べ替えます。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「列によるデータフレームの並べ替え」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. sort()によるベクトルの並べ替え
  2. 柔軟な並べ替えのためのorder()
  3. rank()による値の順位付け
  4. 列によるデータフレームの並べ替え
← R Academyに戻る