sortコマンドは現在のところDataFramesをサポートしていませんが、それは必須です。私はこれをconverting DataFrame列(DataSeries)によってVectorに渡し、output = permutation
オプションを使用してVectorをソートし、その結果でDataFrameを索引付けしました。
Mydata[ sort(convert(Mydata[Value], Vector), output = permutation), .. ];
Mydata[ [4, 2, 1, 3], .. ];
リターン:[値]列の昇順にソートされたデータフレームを返します。この結果により、元のデータフレームのインデックス作成
[4, 2, 1, 3]
:
Mydata := DataFrame(<<2,1,3,0>|<"Red","Blue","Green","Orange">>, columns = [Value,Color]);
sort(convert(Mydata[Value], Vector), output = permutation);
返す:あなたの例を使用します:
[ Value Color ]
[ ]
[4 0 "Orange"]
[ ]
[2 1 "Blue" ]
[ ]
[1 2 "Red" ]
[ ]
[3 3 "Green" ]
しかし、私はDataFramesを何度も並べ替える必要があったので、ほとんどのデータセットで機能するような手順を作成しました。この手順では、sortコマンドを使用する同様のアプローチを使用しますが、Maple DataFrameオブジェクト自体で動作するため、データ変換は不要です。これを行うには、内部のDataFrameデータオブジェクトを直接操作するためにkernelopts(opaquemodules = false)
を設定する必要があります(行列とベクトルの中間に変換することもできますが、この方法では作成される内部データの複製量が制限されます)。
例えば
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" ]
、私はあなたが「価値」を降順にデータフレームを返すようにDSort(Mydata, ByColumn=Value, `>`);
を行うことができるようにあなたも、昇順または降順オプションで追加できることを意味しsort
コマンド、(への追加の引数を渡しますこれは文字列ではうまくいきません)。