2016-07-14 6 views
1

Mapleデータフレームに格納されたデータセットを、指定した列の値で並べ替えることができます。私の例は大きいですが、データは2つの列のデータがあり、1つは数値を持ち、もう1つは文字列を持っています。私は昇順または降順にソート値]列の数値と同じデータフレームを返すことができるようにsortコマンドのようなものが欲しいMapleデータフレームを列の内容で並べ替える

Mydata := DataFrame(<<2,1,3,0>|<"Red","Blue","Green","Orange">>, columns = [Value,Color]); 

:私のようにデータフレームを構築している場合例えばだから、言いますsortコマンドはデータフレームをサポートしていないようです。どのように私はこれを並べ替えることができるかに関する任意のアイデア

答えて

3

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コマンド、(への追加の引数を渡しますこれは文字列ではうまくいきません)。

関連する問題