2026a

# topkrows


按排序顺序的前若干行

函数库: TyBase

# 语法

B = topkrows(X,k)
B = topkrows(X,k,col)
B = topkrows(___,direction)
B = topkrows(___,ComparisonMethod=method)
B,I = topkrows(X,___)

B = topkrows(T,k)
B = topkrows(T,k,vars)
B = topkrows(T,k,vars,direction)
B = topkrows(___,ComparisonMethod=method)
B,I = topkrows(T,___)

# 说明

B = topkrows(X,k) 返回按降序(对于数值数据)或字母顺序倒序(对于文本数据)排序的数组 X 的前 k 行。topkrows 基于第一列中的元素进行排序。当第一列包含值相等的元素时,topkrows 将根据下一列中的元素进行排序,并对后续的相等值重复此行为。示例


B = topkrows(X,k,col) 按 col 指定的列对结果进行排序。使用此语法可连续执行多列排序。例如,topkrows(X,k,5) 基于第五列中的元素按降序对 X 的行进行排序。topkrows(X,k,[4 6]) 首先基于第四列中的元素按降序对行进行排序,然后基于第六列中的元素进一步排序。示例


B = topkrows(___,direction) 使用上述任何语法指定排序方向。direction 可以是 "ascend"、"descend" 或包含这两个值的数组。

例如,topkrows(A,2,[2 3],["ascend" "descend"]) 首先基于第 2 列的元素按升序对行进行排序,从而获得前 2 行。然后基于第 3 列中的元素,对第 2 列中具有相等条目的行按降序排序。示例


B = topkrows(___,ComparisonMethod=method) 指定如何比较复数。比较方法可以是 "auto"、"real" 或 "abs"。示例


B,I = topkrows(X,___) 还返回描述选定行的顺序的索引向量 I,使得 B = X[I,:]。


B = topkrows(T,k) 按照排序顺序返回表或时间表 T 中的前 k 行。表行按其所有变量以降序排序,时间表行按时间以降序排序。示例


B = topkrows(T,k,vars) 按 vars 指定的变量对结果进行排序。使用此语法可按多个变量依次排序。例如,topkrows(T,k,["Var1","Var2"]) 首先基于 Var1 中的元素对 T 的行进行排序,然后基于 Var2 中的元素进行排序。示例


B = topkrows(T,k,vars,direction) 指定排序的方向。例如,使用 "ascend" 对 T 按升序排序。


B = topkrows(___,ComparisonMethod=method) 指定如何比较复数。比较方法可以是 "auto"、"real" 或 "abs"。


B,I = topkrows(T,___) 还返回描述选定行的顺序的索引向量 I,使得 B = T[I,:]。

# 示例

对矩阵行排序
按照不同的排序顺序对矩阵的行进行排序,并查看前几行。

创建一个由 1 到 10 之间的随机整数组成的 20×5 矩阵。

using TyBase
X = rand(1:10, 20, 5)

按降序对 X 的行进行排序,并返回前 4 行。默认情况下,topkrows 使用矩阵的第一列进行排序。对于在特定列中具有相等元素的任何行,将按照右侧紧邻的列进行排序。

TA = TyBase.topkrows(X, 4)
TA=
4×5 Matrix{Int64}:
 10  10  8  7  6
 10   7  8  2  4
 10   4  4  3  5
 10   3  7  9  6

通过三个输入参数调用时,topkrows 完全按照第三个参数中指定的列进行排序。这意味着指定列中具有相等值的行将保持原始顺序。使用第三列中的值按降序对 X 进行排序,并返回前 5 行。

TB = TyBase.topkrows(X, 5, 3)
TB=
5×5 Matrix{Int64}:
  5   7  10  2  6
  2   9   8  6  6
 10  10   8  7  6
 10   7   8  2  4
 10   2   8  3  6

同时使用第三列和第四列对 X 进行排序。在这种情况下,topkrows 先按第 3 列对行进行排序。对于第 3 列中具有相等值的任何行,再按第 4 列进行排序。

TC = TyBase.topkrows(X, 5, [3 4])
TC =
5×5 Matrix{Int64}:
  5   7  10  2  6
 10  10   8  7  6
  2   9   8  6  6
 10   2   8  3  6
 10   7   8  2  4
指定矩阵列的排序方向
使用具有不同排序方向的多个列对矩阵进行排序。

创建一个由 1 到 10 之间的随机整数组成的 100×5 矩阵。

using TyBase
X = rand(1:10, 100, 5);

使用前三列对 X 进行排序,并返回前 10 行。使用数组为每一列指定排序方向。

TA = TyBase.topkrows(X, 10, 1:3, ["descend", "ascend", "ascend"])
TA=
10×5 Matrix{Int64}:
 10  1  4   6  7
 10  1  8   5  1
 10  2  3   4  7
 10  3  5  10  5
  ⋮
 10  5  5   6  7
 10  6  5   5  7
 10  6  6   1  5
 10  7  7   8  1
对表行排序
对表中的异构数据行进行排序。

基于 patients.mat 数据集(包含一组患者的基本健康信息)创建一个表。在该表中包括患者的年龄、性别、身高和自我评估的健康状况。将 SelfAssessedHealthStatus 变量指定为有序分类数组。

using TyBase
path= joinpath(pkgdir(TyBase),"examples","Arrays","ReshapeAndSorting","topkrows","example03_data.jl")
include(path)
T = eg3_data

按降序对表进行排序,并获取前 10 行。结果按照第一个变量 Age 以降序排列。再按照其余的列继续排序:

  • 如果年龄相同,则按 Gender 变量继续排序;

  • 如果性别相同,则按 Height 变量继续排序;

  • 如果身高相同,则按 SelfAssessedHealthStatus 变量继续排序。

TA = TyBase.topkrows(T, 10)
TA=
10×4 DataFrame
 Row │ Age    Gender  Height  SelfAssessedHealthStatus
     │ Int64  String  Int64   String
─────┼─────────────────────────────────────────────────
   1 │    50  Male        72  Excellent
   2 │    50  Male        68  Good
   3 │    49  Male        70  Fair
   4 │    49  Male        68  Poor
   5 │    49  Female      64  Good
   6 │    49  Female      63  Good
   7 │    48  Male        71  Good
   8 │    48  Male        71  Good
   9 │    48  Male        66  Fair
  10 │    48  Female      66  Excellent

通过按 Gender 变量排序,再按 Age 变量排序,获取包含最年轻女性患者的前 10 行。

TB = TyBase.topkrows(T, 10, ["Gender", "Age"], "ascend")
TB=
10×4 DataFrame
 Row │ Age    Gender  Height  SelfAssessedHealthStatus
     │ Int64  String  Int64   String
─────┼─────────────────────────────────────────────────
   1 │    25  Female      63  Good
   2 │    25  Female      64  Excellent
   3 │    27  Female      69  Fair
   4 │    28  Female      65  Good
   5 │    28  Female      65  Good
   6 │    28  Female      66  Good
   7 │    29  Female      63  Excellent
   8 │    29  Female      68  Excellent
   9 │    29  Female      64  Good
  10 │    30  Female      67  Excellent

通过将 Age 变量的排序方向更改为 "descend",获取年龄最大的前 10 名女性患者。

TB = TyBase.topkrows(T, 10, ["Gender", "Age"], ["ascend", "descend"])
TB =
10×4 DataFrame
 Row │ Age    Gender  Height  SelfAssessedHealthStatus
     │ Int64  String  Int64   String
─────┼─────────────────────────────────────────────────
   1 │    49  Female      64  Good
   2 │    49  Female      63  Good
   3 │    48  Female      65  Excellent
   4 │    48  Female      66  Excellent
   5 │    48  Female      64  Excellent
   6 │    48  Female      64  Good
   7 │    48  Female      66  Excellent
   8 │    47  Female      66  Excellent
   9 │    46  Female      68  Good
  10 │    45  Female      68  Excellent
对复数排序
先按绝对值再按实部对复矩阵进行排序。

创建一个由随机复数组成的 100×2 矩阵。

using TyBase
X = rand(-10:10, 100, 2) + im * rand(-10:10, 100, 2);

获取矩阵的前 10 行。默认情况下,topkrows 按绝对值比较复数。

TA = TyBase.topkrows(X, 10)
TA=
10×2 Matrix{ComplexF64}:
 -10.0+9.0im   10.0-2.0im
  -8.0+9.0im    2.0-8.0im
   9.0+8.0im    4.0+7.0im
  -6.0+10.0im  -8.0-7.0im
   6.0-10.0im  -1.0-5.0im
   6.0-10.0im   0.0+5.0im
  -7.0+9.0im   -2.0-5.0im
   9.0-7.0im   10.0+7.0im
   9.0-7.0im    6.0+6.0im
  -9.0-7.0im    9.0+9.0im

通过指定 "comparisonmethod" 名称-值对组,仅使用复数的实部来获取矩阵的前 10 行。

TB = TyBase.topkrows(X, 10; comparisonmethod="real")
TB=
10×2 Matrix{ComplexF64}:
 10.0+4.0im   -3.0-7.0im
 10.0+3.0im    4.0+5.0im
 10.0+2.0im    5.0-7.0im
 10.0-1.0im   -1.0-8.0im
 10.0-1.0im   -6.0+10.0im
 10.0-4.0im   -9.0+0.0im
 10.0-5.0im   -8.0-3.0im
  9.0+8.0im    4.0+7.0im
  9.0+5.0im  -10.0+0.0im
  9.0+1.0im    1.0-9.0im

# 输入参数

X - 输入数组
数值数组 | 逻辑数组 | 字符数组 | 字符串数组 | 分类数组 | 日期时间数组 | 持续时间数
输入数组,指定为数值数组、逻辑数组、字符数组、字符串数组、分类数组、日期时间数组或持续时间数组。
  • 如果 X 是一个非有序分类数组,topkrows 将根据 levels(X) 返回的类别的顺序按降序对元素进行排序;

  • 如果 X 包含 NaN、NaT 或其他缺失值,则 topkrows 会将缺失值放在降序排序的末尾。

数据类型: Float32 | Float64 | Int8 | Int16 | Int32 | Int64 | UInt8 | UInt16 | UInt32 | UInt64 | logical | Char | string | categorical | DateTime数组 | Period数组

复数支持:

T - 输入表
输入表,指定为 DataFrame 。

数据类型: DataFrame

k - 要返回的行数
标量
要返回的行数,指定为非负整数标量。如果 k 大于 X 的行数,则 topkrows 返回 X 的总行数。
col - 要作为排序依据的列
标量 | 向量
要作为排序依据的列,指定为正整数标量或由正整数组成的向量。

示例: B = topkrows(X,100,[1 3]) 在返回前 100 行之前先对第一列和第三列进行排序。

vars - 要作为排序依据的变量
标量 | 向量 | 变量名称 | 数组 | 'RowNames'
要作为排序依据的变量,指定为下表中的选项之一。
选项 示例 说明
正整数 topkrows(T,k,3) 整数 n 指定 T.Properties.VariableNames{n} 返回的要作为排序依据的变量的索引。
正整数向量 topkrows(T,k,[1 3]) 向量 [n1 n2 …] 指定 T.Properties.VariableNames{[n1 n2 …]} 返回的要作为排序依据的多个变量的索引。
逻辑向量 topkrows(T,k,[true false true]) 使用 true 或 false 值指定要作为排序依据的一个或多个变量。
变量名称 topkrows(T,k,"Var3") 将排序变量指定为 T.Properties.VariableNames 中列出的变量名称之一。
数组 topkrows(T,k,["Var1" "Var3"]) 指定从 T.Properties.VariableNames 中选择的多个排序变量。
"RowNames" topkrows(T,k,"RowNames") 仅适用于表。此选项按行名称对结果进行排序。

示例: B = topkrows(X,k,[1 3]) 对第一列和第三列进行排序。

示例: B = topkrows(X,k,"Year") 使用 Year 变量进行排序。

direction - 排序方向
"descend" (默认) | "ascend" | 数组
排序方向,指定为"descend"、"ascend" 或包含这两个值的某种组合的数组。

如果 direction 是一个数组,则必须包含与 col 或 vars 指定的每个排序列对应的 "descend" 或 "ascend"。如果不指定 col 或 vars,则数组必须包含对应于 X 中的每一列或 T 中的每个变量的 "descend" 或 "ascend"。

method - 复数的比较方法
"auto" (默认) | "real" | "abs"
复数的比较方法,指定为下列值之一:
  • "auto" -(默认值)按 "real" 比较实数,按 "abs" 比较复数;

  • "real" - 按实部 real(A) 比较数字。实部相等的数字再按虚部 imag(A) 进行比较;

  • "abs" - 按绝对值 abs(A) 比较数字。模相等的数字再按相位角 angle(A) 进行比较。

此选项不支持非数值输入数据(DateTime、Period、String 等)。

# 输出参数

B - 请求的行
数组
请求的行,以与 X 或 T 同类的数组形式返回。
I - 行索引
向量
行索引,以向量形式返回。I 描述所选行的顺序,使得 B = X[I,:] 或 B = T[I,:]。

# 提示

  • topkrows 不会对输入数据进行完全排序,因此当请求的行数较少时,它通常比 sort 和 sortrows 要快。

# 另请参阅

first | sort | sortrows| last