0Pricing
R Academy · 课时

使用 order() 灵活排序

获取索引排列,以便按一个或多个条件排序

使用 order() 灵活排序 是 CoddyKit 上的免费 R Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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')

按一列对数据框排序

order() 最实用的用途是根据数据框中的某一列进行排序。将该列传给 order(),然后使用得到的索引重新排列数据框的所有行。

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

按降序对数据框排序

若要根据数值列将数据框从大到小排序,请将 decreasing = TRUE 传给 order()。输出中的行名(索引)会反映原始位置。

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 会先按第一个参数排序,再使用第二个、第三个参数等处理并列值。这与 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), ]

混合升序和降序的多列排序

若要让一列升序、另一列降序排列,请在降序的数值列前加 -。对于字符列,请使用 xtfrm() 获取可排序的整数表示,然后对其取负。

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() 也有 na.last 参数,与 sort() 类似。默认情况下,na.last = NA,会将 NAs 放在末尾。设置 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)

排序后保留行名

使用行索引对数据框取子集时,R 会保留原始行名。排序后,可以使用 row.names(df) <- NULL 或 reset= 方法将行名重置为 1、2、3……。

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')

按字符串列对数据框排序

您也可以按字符列排序。order(df$name) 会按照 name 列的字母顺序返回行索引,然后您可以使用这些索引重新排列数据框。

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

使用 order() 链式执行复杂排序

三级排序很简单:将三个向量传给 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), ] 对数据框排序
  • 多列排序: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() 灵活排序」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「使用 order() 灵活排序」这节课中我会学到什么?

获取索引排列,以便按一个或多个条件排序 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 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