2026a

# sortrows


对矩阵行或表行进行排序。

函数库: TyBase

# 语法

f = sortrows(A)  
f = sortrows(A,column)  
f = sortrows(___,direction)  
f = sortrows(___;Key=Value)  
f,index = sortrows(___;nargout = 1)

# 说明

f = sortrows(A) 基于第一列中的元素按升序对矩阵行进行排序。当第一列包含重复的元素时,sortrows 会根据下一列中的值进行排序,并对后续的相等值重复此行为。示例


f = sortrows(A,column) 基于向量 column 中指定的列对 A 进行排序。例如,sortrows(A,4) 会基于第四列中的元素按升序对 A 的行进行排序。sortrows(A,[4 6]) 首先基于第四列中的元素,然后基于第六列中的元素,对 A 的行进行排序。示例


对于上述任意语法,f = sortrows(___,direction) 均按 direction 指定的顺序对 A 的行进行排序。direction 可以是 "ascend"(默认值,对于升序排序)或 "descend"(对于降序排序)。direction 也可以是元素为 "ascend" 和 "descend" 的元组,其中每个元素对应于 sortrows 对其进行运算的一个列。例如,sortrows(A,[4 6],["ascend" "descend"]) 基于第四列按升序对 A 的行进行排序,然后基于第六列按降序排序。示例


f = sortrows(___;Key=Value) 指定用于对行进行排序的其他参数。例如,sortrows(A,comparisonmethod="abs") 按模对 A 的元素进行排序。示例


f,index = sortrows(___;nargout = 1) 还会返回描述行的重新排列的索引向量,以便 f = A(index,:)。示例

# 示例

对矩阵行排序

创建矩阵,并基于第一列中的元素按升序对矩阵行进行排序。当第一列包含重复的元素时,sortrows 会基于第二列中的元素进行排序。对于第二列中的重复元素,sortrows 会基于第三列进行排序,依此类推。

using TyBase

A = [ 95 45 92 41 13 1  84
      95 7  73 89 20 74 52
      95 7  73 5  19 44 20
      95 7  40 35 60 93 67
      76 61 93 81 27 46 83
      76 79 91 0  19 41 1 ]
A = 
6×7 Matrix{Int64}:
 95  45  92  41  13   1  84
 95   7  73  89  20  74  52
 95   7  73   5  19  44  20
 95   7  40  35  60  93  67
 76  61  93  81  27  46  83
 76  79  91   0  19  41   1
B = sortrows(A)
B = 
6×7 Matrix{Int64}:
 76  61  93  81  27  46  83
 76  79  91   0  19  41   1
 95   7  40  35  60  93  67
 95   7  73   5  19  44  20
 95   7  73  89  20  74  52
 95  45  92  41  13   1  84

基于第二列中的值对 A 的行排序。当指定的列包含重复元素时,对应的行将保持其原始顺序。

C = sortrows(A, 2)
C = 
6×7 Matrix{Int64}:
 95   7  73  89  20  74  52
 95   7  73   5  19  44  20
 95   7  40  35  60  93  67
 95  45  92  41  13   1  84
 76  61  93  81  27  46  83
 76  79  91   0  19  41   1

基于第一列中的元素对 A 的行进行排序,如果第一列中包含相同元素,则按第七列进行排序。

D = sortrows(A, [1 7])
D = 
6×7 Matrix{Int64}:
 76  79  91   0  19  41   1
 76  61  93  81  27  46  83
 95   7  73   5  19  44  20
 95   7  73  89  20  74  52
 95   7  40  35  60  93  67
 95  45  92  41  13   1  84

基于第四列中的元素以降序对 A 的行进行排序,并显示输出向量 index 以查看行是如何重新排列的。

E, index = sortrows(A, 4, "descend"; nargout=2)
E = 
6×7 Matrix{Int64}:
 95   7  73  89  20  74  52
 76  61  93  81  27  46  83
 95  45  92  41  13   1  84
 95   7  40  35  60  93  67
 95   7  73   5  19  44  20
 76  79  91   0  19  41   1

index = 
6-element Vector{Int64}:
 2
 5
 1
 4
 3
 6
复矩阵

创建一个包含复数的矩阵,并基于第一列中的元素按升序对矩阵行进行排序。由于 A[1,1] 和 A[3,1] 的模相等,因此 sortrows 会计算它们的角度以进行排序。

using TyBase

A = [1+2im 3+im im; 2+10im 6im 2+5im; 2+im 4 3+3im]
A = 
3×3 Matrix{Complex{Int64}}:
 1+2im   3+1im  0+1im
 2+10im  0+6im  2+5im
 2+1im   4+0im  3+3im
B = sortrows(A)
B = 
3×3 Matrix{Complex{Int64}}:
 2+1im   4+0im  3+3im
 1+2im   3+1im  0+1im
 2+10im  0+6im  2+5im
angle(A[1, 1])
ans = 
1.1071487177940904
angle(A[3, 1])
ans = 
0.4636476090008061

可使用 "real" 选项按 A 行的实部对这些行进行排序。由于 A[2,1] 和 A[3,1] 具有相同的实部,sortrows 将使用虚部进行排序。

C = sortrows(A; comparisonmethod="real")
C = 
3×3 Matrix{Complex{Int64}}:
 1+2im   3+1im  0+1im
 2+1im   4+0im  3+3im
 2+10im  0+6im  2+5im
imag(A[2, 1])
ans = 
10
imag(A[3, 1])
ans = 
1
对字符串数组排序

创建一个 6×2 字符串数组,并对其行进行排序。结果是一个同时按国家/地区和名称排序的字母顺序列表。

using TyBase

A = [ "Germany" "Lukas"
      "USA"     "William"
      "USA"     "Andrew"
      "Germany" "Andreas"
      "USA"     "Olivia"
      "Germany" "Julia" ]
A = 
6×2 Matrix{String}:
 "Germany"  "Lukas"
 "USA"      "William"
 "USA"      "Andrew"
 "Germany"  "Andreas"
 "USA"      "Olivia"
 "Germany"  "Julia"
B = sortrows(A)
B = 
6×2 Matrix{String}:
 "Germany"  "Andreas"
 "Germany"  "Julia"
 "Germany"  "Lukas"
 "USA"      "Andrew"
 "USA"      "Olivia"
 "USA"      "William"

按照降序顺序,先对国家/地区进行排序,然后对名称进行排序。

C = sortrows(A, [1 2], ["ascend", "descend"])
C = 
6×2 Matrix{String}:
 "Germany"  "Lukas"
 "Germany"  "Julia"
 "Germany"  "Andreas"
 "USA"      "William"
 "USA"      "Olivia"
 "USA"      "Andrew"
对表行排序

按变量值对表行进行排序。

创建一个表,其中包含列出五位病患信息的四个变量。

using TyBase

df1 = DataFrame(
    "RowNames" => ["Smith"; "Johnson"; "Williams"; "Jones"; "Brown"],
    "Age" => [38; 43; 38; 40; 49],
    "Height" => [71; 69; 64; 67; 64],
    "Weight" => [176; 163; 131; 133; 119],
    "BloodPressure1" => [124; 109; 125; 117; 122],
    "BloodPressure2" => [93; 77; 83; 75; 80],
)
df1 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight  BloodPressure1  BloodPressure2 
     │ String    Int64  Int64   Int64   Int64           Int64
─────┼─────────────────────────────────────────────────────────────────
   1 │ Smith        38      71     176             124              93
   2 │ Johnson      43      69     163             109              77
   3 │ Williams     38      64     131             125              83
   4 │ Jones        40      67     133             117              75
   5 │ Brown        49      64     119             122              80

对该表的行排序。sortrows 函数首先按变量 Age 以升序对行进行排序,然后按变量 Height 对具有相等年龄的两行进行排序。

df2 = sortrows(df1)
df2 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight  BloodPressure1  BloodPressure2 
     │ String    Int64  Int64   Int64   Int64           Int64
─────┼─────────────────────────────────────────────────────────────────
   1 │ Williams     38      64     131             125              83
   2 │ Smith        38      71     176             124              93
   3 │ Jones        40      67     133             117              75
   4 │ Johnson      43      69     163             109              77
   5 │ Brown        49      64     119             122              80
按行名称对表行排序

创建一个表,其中包含列出五位病患信息的四个变量。

using TyBase

df1 = DataFrame(
    "RowNames" => ["Smith"; "Johnson"; "Williams"; "Jones"; "Brown"],
    "Age" => [38; 43; 38; 40; 49],
    "Height" => [71; 69; 64; 67; 64],
    "Weight" => [176; 163; 131; 133; 119],
    "BloodPressure1" => [124; 109; 125; 117; 122],
    "BloodPressure2" => [93; 77; 83; 75; 80],
)
df1 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight  BloodPressure1  BloodPressure2 
     │ String    Int64  Int64   Int64   Int64           Int64
─────┼─────────────────────────────────────────────────────────────────
   1 │ Smith        38      71     176             124              93 
   2 │ Johnson      43      69     163             109              77 
   3 │ Williams     38      64     131             125              83 
   4 │ Jones        40      67     133             117              75 
   5 │ Brown        49      64     119             122              80 

基于行名称按升序对表行进行排序,并返回描述行重新排列方式的索引向量。

df2, index = sortrows(df1, "RowNames"; nargout=2)
df2 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight  BloodPressure1  BloodPressure2 
     │ String    Int64  Int64   Int64   Int64           Int64
─────┼─────────────────────────────────────────────────────────────────
   1 │ Brown        49      64     119             122              80
   2 │ Johnson      43      69     163             109              77
   3 │ Jones        40      67     133             117              75
   4 │ Smith        38      71     176             124              93
   5 │ Williams     38      64     131             125              83

index = 
5-element Vector{Int64}:
 5
 2
 4
 1
 3
按变量对表行进行排序

创建一个表,其中包含列出五位病患信息的四个变量。

using TyBase

df1 = DataFrame(
    "RowNames" => ["Sweet"; "Jacobson"; "Wang"; "Joiner"; "Berger"],
    "Age" => [38; 43; 38; 40; 49],
    "Height" => [71; 69; 64; 67; 64],
    "Weight" => [176; 163; 131; 133; 119],
    "BloodPressure1" => [124; 109; 125; 117; 122],
    "BloodPressure2" => [93; 77; 83; 75; 80],
)
df1 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight  BloodPressure1  BloodPressure2 
     │ String    Int64  Int64   Int64   Int64           Int64
─────┼─────────────────────────────────────────────────────────────────
   1 │ Sweet        38      71     176             124              93 
   2 │ Jacobson     43      69     163             109              77 
   3 │ Wang         38      64     131             125              83 
   4 │ Joiner       40      67     133             117              75
   5 │ Berger       49      64     119             122              80

按 Height 以升序对表行排序,然后按 Weight 以降序排序。

df2 = sortrows(df1, ["Height", "Weight"], ["ascend", "descend"])
df2 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight  BloodPressure1  BloodPressure2
     │ String    Int64  Int64   Int64   Int64           Int64
─────┼─────────────────────────────────────────────────────────────────
   1 │ Wang         38      64     131             125              83
   2 │ Berger       49      64     119             122              80
   3 │ Joiner       40      67     133             117              75
   4 │ Jacobson     43      69     163             109              77
   5 │ Sweet        38      71     176             124              93
包含缺失元素的表

创建一个表,其中包含列出五位病患信息的四个变量。Weight 变量包含缺失值。

using TyBase

df1 = DataFrame(
    "RowNames" => ["Sweet"; "Jacobson"; "Wang"; "Joiner"; "Berger"],
    "Age" => [38; 43; 38; 40; 49],
    "Height" => [71; 69; 64; 67; 64],
    "Weight" => [176; NaN; 131; 133; NaN],
    "BloodPressure1" => [124; 109; 125; 117; 122],
    "BloodPressure2" => [93; 77; 83; 75; 80],
)
df1 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight   BloodPressure1  BloodPressure2 
     │ String    Int64  Int64   Float64  Int64           Int64
─────┼──────────────────────────────────────────────────────────────────
   1 │ Sweet        38      71    176.0             124              93 
   2 │ Jacobson     43      69    NaN               109              77
   3 │ Wang         38      64    131.0             125              83
   4 │ Joiner       40      67    133.0             117              75
   5 │ Berger       49      64    NaN               122              80

按 Weight 以升序对表行进行排序,将包含 NaN 的行放在最前面。

df2 = sortrows(df1, "Weight"; missingplacement="first")
df2 = 
5×6 DataFrame
 Row │ RowNames  Age    Height  Weight   BloodPressure1  BloodPressure2 
     │ String    Int64  Int64   Float64  Int64           Int64
─────┼──────────────────────────────────────────────────────────────────
   1 │ Jacobson     43      69    NaN               109              77
   2 │ Berger       49      64    NaN               122              80
   3 │ Wang         38      64    131.0             125              83
   4 │ Joiner       40      67    133.0             117              75
   5 │ Sweet        38      71    176.0             124              93
对时间表行进行排序

创建一个时间表,并按行时间对行进行排序。

using TyBase
TT = DataFrame(;
    TimeDuration=[Hour(3), Hour(2), Hour(1), Hour(5), Hour(6)],
    Var1=[98; 97.5; 97.9; 98.1; 101],
    Var2=[120; 111; 119; 117; 118],
)
d2 = sortrows(TT, "TimeDuration")
d2 = 
5×3 DataFrame
 Row │ TimeDuration  Var1     Var2  
     │ Hour          Float64  Int64 
─────┼──────────────────────────────
   1 │ 1 hour           97.9    119
   2 │ 2 hours          97.5    111
   3 │ 3 hours          98.0    120
   4 │ 5 hours          98.1    117
   5 │ 6 hours         101.0    118

# 输入参数

A - 输入数组
列向量 | 矩阵

输入数组,指定为列向量或矩阵。

数据类型: Float64 | Float32 | Int8 | Int16 | Int32 | Int64 | UInt8 | UInt16 | UInt32 | UInt64 | Bool | Char | String | Datetime | Duration

复数支持:

column - 列排序向量
整数 | 整数元组 | 整数向量 | 整数行矩阵 | 整数列矩阵

列排序向量,指定为整数、整数元组、整数向量、行或列整数矩阵。每个指定的整数值指示一个按其排序的列。负整数表示排序顺序为降序。

direction - 排序方向
字符串 | 字符串数组 | 字符串向量 | 整数行矩阵 | 整数列矩阵
排序方向,指定为包含 "ascend"(默认值)或 "descend" 的字符串或字符串数组。如果 direction 是字符串数组,则条目数必须与要排序的列数或变量数匹配。

如果同时指定 column 参数和 direction 参数,则 sortrows 根据 direction 进行排序,而忽略 column 中元素的符号。

nargout - 控制输出参数
Int

nargout 控制输出参数的个数。

数据类型: Int

# 关键词参数

指定可选的、以逗号分隔的 Key=Value 关键词参数。Key 为关键词参数名称,Value 为对应的值。您可采用任意顺序指定多个名称-值对组参数,如 Key1=Value1,...,KeyN=ValueN 所示。

示例: sortrows(A; missingplacement="last")

missingplacement - 缺失值的位置
"auto" (默认) | "first" | "last"

缺失值(NaN、NaT、<undefined> 和 missing)的位置,指定为逗号分隔的对组,包含 missingplacement 和下列项之一:

  • "auto" - 缺失的元素放在最后(对于升序排序)或放在最前面(对于降序排序);

  • "first" - 缺失的元素放在最前面;

  • "last" - 缺失的元素放在最后。

数据类型: String

comparisonmethod - 元素比较方法
"auto" (默认) | "real" | "abs"

元素比较方法,指定为逗号分隔的对组,包含 comparisonmethod 和下列项之一:

  • "auto" - 当 A 为实数时,按 real(A) 对 A 的行进行排序;当 A 为复数时,按 abs(A) 进行排序;

  • "real" - 当 A 为实数或复数时,按 real(A) 对 A 的行进行排序。如果 A 的列包含具有相等实部的元素,则使用 imag(A) 进行排序;

  • "abs" - 当 A 为实数或复数时,按 abs(A) 对 A 的行进行排序。如果 A 的列包含具有相等模的元素,则使用区间 (-π,π] 中的 angle(A) 进行排序。

数据类型: String

# 输出参数

f - 已排序数组
向量 | 矩阵 | 多维数组

已排序的数组,以向量、矩阵或多维数组的形式返回。f 的大小与 A 相同。

数据类型: Float64 | Float32 | Int8 | Int16 | Int32 | Int64 | UInt8 | UInt16 | UInt32 | UInt64 | Bool | Char | String | Datetime | Duration

index - 排序索引
索引向量

排序索引,以索引向量的形式返回。排序索引描述输入中的行的重新排列,以便 f = A(index,:)。

数据类型: Float64

# 另请参阅

ty_issorted | ty_sort