# 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 - 要返回的行数
标量
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" | 数组
如果 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 - 请求的行
数组
I - 行索引
向量
# 提示
- topkrows 不会对输入数据进行完全排序,因此当请求的行数较少时,它通常比 sort 和 sortrows 要快。