我有一个存储在Maple数据框中的数据集,我希望按给定列中的值进行排序。我的例子比较大,但数据是这样的,我有两列数据,一列有一些数值,另一列有字符串。例如,假如我将数据框构造为:
Mydata := DataFrame(<<2,1,3,0>|<"Red","Blue","Green","Orange">>, columns = [Value,Color] );
我喜欢sort命令之类的东西能够返回相同的数据帧,其中Value列中的数字按升序或降序排序,但sort命令似乎不支持数据帧。关于如何对此进行排序的任何想法?
答案 0 :(得分:3)
你是对的,sort命令目前不支持DataFrames(但它应该!)。我已经通过converting DataFrame列(DataSeries)到Vector,使用output = permutation
选项对Vector进行排序,然后通过结果索引DataFrame。使用您的示例:
Mydata := DataFrame(<<2,1,3,0>|<"Red","Blue","Green","Orange">>, columns = [Value,Color] );
sort( convert( Mydata[Value], Vector ), output = permutation );
返回:
[4, 2, 1, 3]
通过此结果索引原始DataFrame,然后按Value列的升序返回已排序的DataFrame:
Mydata[ sort( convert( Mydata[Value], Vector ), output = permutation ), .. ];
Mydata[ [4, 2, 1, 3], .. ];
返回:
[ Value Color ]
[ ]
[4 0 "Orange"]
[ ]
[2 1 "Blue" ]
[ ]
[1 2 "Red" ]
[ ]
[3 3 "Green" ]
那就是说,我需要多次对DataFrames进行排序,所以我还创建了一个似乎适用于我的大多数数据集的过程。此过程使用类似的使用sort命令的方法,但它不需要任何数据转换,因为它适用于Maple DataFrame对象本身。为此,我需要设置kernelopts(opaquemodules = false)
以便直接使用内部DataFrame数据对象(您还可以对中间矩阵和向量进行一系列转换,但这种方法限制了重复内部数据的数量。创建):
DSort := proc( self::{DataFrame,DataSeries}, {ByColumn := NULL} )
local i, opacity, orderindex;
opacity := kernelopts('opaquemodules' = false):
if type( self, ':-DataFrame' ) and ByColumn <> NULL then
orderindex := sort( self[ByColumn]:-data, ':-output' = ':-permutation', _rest );
elif type( self, ':-DataSeries' ) and ByColumn = NULL then
orderindex := sort( self:-data, ':-output' = ':-permutation', _rest );
else
return self;
end if;
kernelopts(opaquemodules = opacity): #Set opaquemodules back to original setting
if type( self, ':-DataFrame' ) then
return DataFrame( self[ orderindex, .. ] );
else
return DataSeries( self[ orderindex ] );
end if;
end proc:
例如:
DSort( Mydata, ByColumn=Value );
返回:
[ Value Color ]
[ ]
[4 0 "Orange"]
[ ]
[2 1 "Blue" ]
[ ]
[1 2 "Red" ]
[ ]
[3 3 "Green" ]
这也适用于字符串,因此DSort( Mydata, ByColumn=Color );
应该有效。
[ Value Color ]
[ ]
[2 1 "Blue" ]
[ ]
[3 3 "Green" ]
[ ]
[4 0 "Orange"]
[ ]
[1 2 "Red" ]
在此过程中,我将其他参数传递给sort
命令,这意味着您还可以添加升序或降序选项,这样您就可以执行DSort( Mydata, ByColumn=Value, `>` );
以降序返回DataFrame'价值'顺序(虽然这似乎不适合字符串)。