列によるデータフレームの並べ替え
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- sort()によるベクトルの並べ替え
- 柔軟な並べ替えのためのorder()
- rank()による値の順位付け
- 列によるデータフレームの並べ替え