0Pricing
R Academy · レッスン

柔軟な並べ替えのためのorder()

1つまたは複数の条件で並べ替えるためのインデックス順列を取得します。

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

order() が返すもの

order()はソート済みの値を返すのではなく、ベクトルをソートするためのインデックスを返します。この間接的な仕組みにより、関連する任意の構造にそのインデックスを適用できるため、sort()よりもはるかに強力です。

x <- c(30, 10, 50, 20, 40)
indices <- order(x)
print(indices)
# Verify: x[indices] gives sorted x
print(x[indices])

降順での order()

sort()と同様に、order()にdecreasing = TRUEを指定すると、降順の並びを作るインデックスが返されます。値を大きい順に並べる場合に便利です。

scores <- c(78, 92, 65, 88, 71)
desc_order <- order(scores, decreasing = TRUE)
cat('Rank order (index):', desc_order, '\n')
cat('Scores high to low:', scores[desc_order], '\n')

1列を基準にした Data Frame のソート

order()の最も実用的な用途は、Data Frameを列の値でソートすることです。列をorder()に渡し、そのインデックスを使ってData Frameのすべての行を並べ替えます。

df <- data.frame(
  name = c('Charlie', 'Alice', 'Bob', 'Diana'),
  age  = c(35, 28, 42, 31)
)
sorted_df <- df[order(df$age), ]
print(sorted_df)

Data Frame の降順ソート

数値列を基準にData Frameを大きい順にソートするには、order()にdecreasing = TRUEを渡します。出力の行名(インデックス)には元の位置が反映されます。

products <- data.frame(
  item  = c('Pen', 'Notebook', 'Stapler', 'Tape'),
  price = c(1.5, 4.99, 7.25, 2.10)
)
products[order(products$price, decreasing = TRUE), ]

複数列による並べ替え

複数のベクトルをコンマで区切ってorder()に渡します。Rは最初の引数でソートし、同じ値がある場合は2番目、3番目というように次の引数で順序を決めます。これはSQLのORDER BY句と同じ動作です。

df <- data.frame(
  dept   = c('HR', 'IT', 'HR', 'IT', 'HR'),
  salary = c(50000, 70000, 60000, 65000, 55000)
)
# Sort by dept first, then by salary within dept
df[order(df$dept, df$salary), ]

昇順と降順を混在させた複数列ソート

ある列を昇順、別の列を降順にするには、降順にしたい数値列に-を付けます。Character 列の場合はxtfrm()でソート可能なinteger表現を取得してから、そこに-を付けます。

df <- data.frame(
  dept   = c('HR', 'IT', 'HR', 'IT', 'HR'),
  salary = c(50000, 70000, 60000, 65000, 55000)
)
# dept ascending, salary descending
df[order(df$dept, -df$salary), ]

order() での NA の処理

order()にもsort()と同様にna.last引数があります。デフォルトはna.last = NAで、NAを末尾に配置します。na.last = TRUEまたはna.last = FALSEを指定すると、配置を明示的に制御できます。

vals <- c(5, NA, 2, NA, 8, 1)
# Default: NAs sorted last
order(vals)
# NAs first
order(vals, na.last = FALSE)

ソート後の行名の保持

行インデックスを使ってData Frameをサブセット化すると、Rは元の行名を保持します。ソート後に行名を1、2、3、...に戻すには、row.names(df) <- NULLまたはreset=を使う方法があります。

df <- data.frame(
  city = c('Paris', 'Tokyo', 'NYC'),
  pop  = c(2.1, 13.9, 8.3)
)
sorted <- df[order(df$pop), ]
print(sorted)
# Reset row names
row.names(sorted) <- NULL
print(sorted)

order() と sort() の比較

主な違いは次のとおりです。sort(x)はソート済みの値を返し、order(x)はソート済みの位置を返します。値だけが必要ならsort()を、関連するデータ構造もまとめて並べ替えるならorder()を使用します。

x <- c(50, 20, 80, 10, 60)
cat('sort(x)  :', sort(x), '\n')
cat('order(x) :', order(x), '\n')
cat('x[order(x)]:', x[order(x)], '\n')

String 列を基準にした Data Frame のソート

Character 列を基準にソートすることもできます。order(df$name)は、name列をアルファベット順に並べる行インデックスを返します。そのインデックスを使ってData Frameを並べ替えます。

employees <- data.frame(
  name   = c('Zara', 'Ahmed', 'Maria', 'Bruno'),
  tenure = c(3, 7, 2, 5)
)
employees[order(employees$name), ]

order() の連鎖による複雑なソート

3段階のソートも簡単です。3つのベクトルをorder()に渡します。追加した各引数は、それまでの引数で値が等しい場合のタイブレーカーとして使われます。

df <- data.frame(
  region = c('West', 'East', 'West', 'East', 'West'),
  dept   = c('HR', 'IT', 'HR', 'IT', 'IT'),
  score  = c(85, 90, 78, 88, 92)
)
df[order(df$region, df$dept, df$score), ]

確認問題

ベクトルxにorder(x)を適用すると、何が返されますか?

order() の重要ポイント

order() の重要なポイント:

  • order(x)は値ではなくインデックスを返します。ソート済みの値を得るにはx[order(x)]を使用します
  • df[order(df$col), ]でData Frameをソートします
  • 複数列のソートにはorder(df$a, df$b)を使います。aの同順位はbで決まります
  • 複数列ソートで数値列を降順にするには、列に-を付けます
  • na.last = TRUE/FALSE/NAでNAの配置を制御します
  • sort()と異なり、order()では並列するデータ構造をまとめてソートできます
df <- data.frame(
  name  = c('Eve', 'Bob', 'Alice', 'Charlie'),
  score = c(88, 92, 88, 75)
)
# Sort by score descending, then name ascending for ties
df[order(-df$score, df$name), ]

よくある質問

「柔軟な並べ替えのためのorder()」レッスンは無料ですか?

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

「柔軟な並べ替えのためのorder()」で何を学びますか?

1つまたは複数の条件で並べ替えるためのインデックス順列を取得します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「柔軟な並べ替えのためのorder()」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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