按列排序数据框
使用 order() 和 dplyr 的 arrange() 排序整个数据框
按列排序数据框 是 CoddyKit 上的免费 R Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
按一列对数据框排序
使用基础 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() 传入多个列,即可先按主要条件、再按次要条件排序。第二个参数会处理第一个参数中的并列情况。这与 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 不是基础 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 行,或使用 tail() 获取后 N 行。这相当于基础 R 中 SQL 的 ORDER BY ... LIMIT N。
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)快速检查
如何使用基础 R,按数值列 df$salary 对数据框 df 进行降序排序?
数据框排序:要点
数据框排序的要点:
- 基础 R 惯用写法:
df[order(df$col), ] - 数值降序:在
order(-df$col)中使用-取负 - 字符降序:使用
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)常见问题解答
「按列排序数据框」课时是免费的吗?
是的 — 「按列排序数据框」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「按列排序数据框」这节课中我会学到什么?
使用 order() 和 dplyr 的 arrange() 排序整个数据框 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「按列排序数据框」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。