アイテム1
ここの項目1の挑戦的な部分チャレンジ10コードではなく、分位数の定義に関する複雑さです。 まず、物事の分布を独立させ、値を直接ではなく、値のランク順で操作しましょう。 つまり、値を昇順で並べ替え、その順序で表示される場所に従って番号を付けます。 ネクタイをどうするかを決める必要があります。 それらを順番にランク付けし続けることも、同じ値を与えることもできます。 前者の欠点は、同じ値が複数のグループに表示される可能性があることです。 後者のアプローチの欠点は、グループごとのアイテム数のバランスが取れていない可能性があることです。 これらの2つのアプローチは、ランキングとランキングネクタイJSL機能。 2番目のアプローチでどのような価値を結び付けるかについては話していません。 それらすべてに次の連続したランク順の値を与えることができます。 または、順番にランク付けされた値を平均することもできます。 どちらの場合も、タイがない場合に受け取ったであろうランクを、次の連続したタイでない値に与えたいと思うでしょう。 ランキングネクタイランクを平均します。簡単にするために、これを使用します。
次の質問は、グループをどのように分割するかです。 それらを可能な限り均等に分割することを試みることができます。 これを行う簡単な方法は、少なくともタイを順番にランク付けすることです。床(( NS / NS )各グループのアイテム(ここでNSアイテムの総数とNS分位数グループの数です)。 どこに置くかを決める必要がありますNS – NS *床(( NS / NS )< NS追加の値。 以下のコードは、これらすべてを簡単かつきちんと処理します。
天井(ランキング(inVec)/(N行(inVec)/クォンツ))
どこinVec入力(列)ベクトルであり、クォンツ分位数グループの数。
上記のコードにより、タイの値がグループ間で分割される可能性があります。 これを回避するために、置き換えることができますランキングとランキングネクタイ。 全機能の例を以下に示します。
quantileGroup = Function({inVec,quant=10,method=1},{outVec,sumTblRef,ranks},
inVec = Shape(inVec,N Row(invec)*N Col(inVec),1);
If(method ==1,
outVec = Ceiling(Ranking(inVec)/(N Row(inVec)/quant)),
outVec = Ceiling(Ranking Tie(inVec)/(N Row(inVec)/quant))
);
outVec;
);
アイテム2
少数のグループを集計するには、さまざまな方法があります。観測の絶対数、観測の相対数(たとえば、最大グループの10%未満のカウントを持つグループ)、グループの総数の固定などです。その長所と短所があります。 柔軟なソリューションを提供するために、スライダーを使用して調整可能な棒グラフで管理される、インタラクティブで視覚的なアプローチを選択します。 このようにして、見栄えのするグループの分布が見つかるまで、スライダーを前後に動かすことができました。 難しいのは、グループの数が多いときに高速なコードを考え出すことでした。 簡単にするために、私はデータテーブルの操作とプラットフォームを操作したいと思いました(自動再計算オン)。 以下は、これが前後にどのように見えるかの例です。
前

後

一般的に、このコードは、グループから要約テーブルを作成し、グループカウントを使用することで機能します( N行列)として周波数変数。 これにより、かなり大きくなる可能性のある元のテーブルから値を更新する必要がなくなります。 コードはにあります集合グループ.JSL 。 要約からの元のグループ値のリストは、カウント(ランク)のベクトルランク順に加えて、グローバル変数グループに格納されます。 スライダーを動かすと、 AggregateLowCountsグループの要求数( nGroups )は、スライダーの位置に基づいて渡されます。 グループの数は、ランクベクトルから簡単に選択できます。 たとえば、合計10のグループが必要な場合、ランク10以上の元のグループの値は、他のすべてのグループが同じままで、集約されたグループ値(たとえば、「その他」)に設定されます。 テーブルは並べ替えられているため、行10以降で値を変更するだけで済みます。
アイテム3 /アイテム4
このアイテムに対する私の動機は、アイテム4の前身としてでした。 連想配列(AA)で何かを見つけることは、使用するよりも世界的に高速ですLoc 。 からの209,405語でAAを構築する単語リスト.JMP私のコンピューターでは12秒弱かかりました。 以下の表は、いずれかを使用して表からランダムな単語のリストを見つける時間を示していますLocまたはAA。
Nワード
|
位置(秒)
|
連想配列(秒)
|
1
|
0.19
|
0.000045
|
5
|
0.91
|
0.000127
|
10
|
1.78
|
0.000244
|
25
|
4.51
|
0.000592
|
50
|
9.11
|
0.001019
|
70
|
12.47
|
0.001454
|
100
|
17.82
|
0.002155
|
70語を超えるリストの場合、AAを作成するのにお金がかかります。 これら2つのアプローチをテストするために使用したコードは次のとおりです。 Loc vs AA.JSL 。
AAを検索可能なデータ構造として使用することには長所と短所があります。 プラス面として、他のAAを含め、任意の値をAAキーに関連付けることができます。 欠点は、キーが一意である必要があり(私のオプションでは大したことではありません)、さらに重要なことに、検索値がキーのリストにない場合は検索プロセスを拡張する必要があることです。 つまり、考えられるすべての検索値が事前にわかっている場合、実装は比較的簡単ですが、知られていない場合は少し注意が必要です。 これは、それらを使用できないという意味ではありません。少し巧妙にする必要があります。 以下のコードのようなものが機能します項目3でタグ付けされた投稿に記載されているケース。 少し面倒で、場合によっては遅くなる可能性がありますが、非常に柔軟性があります。 連想配列の内容を変更するだけで、ルックアップディクショナリが変更される状況に簡単に適応できます。
aaMap = Associative Array(
{"1","2","3","4","5","6","7","8","9","0","M","K"},
{"1","2","3","4","5","6","7","8","9","0","e6","e3"}
);
findAndReplace = Function({inList,aaMap},
outNums = Transform Each({nextString},inList,Output("Matrix"),
nextChars = Items(nextString,"");
Num(Concat Items(Transform Each({nextChar},nextChars,aaMap[nextChar]),""));
);
outNums
);
LesMisérablesの英語訳に登場するすべての単語の辞書を作成するなど、もう少し一般的で大きなものに取り組みたい場合はどうすればよいですか? 単語がアルファベット文字のみで構成されていると仮定することから始めましょう。これには、標準のASCII文字セット以外の文字(発音区別符号付きの文字など)も含まれる可能性があります。 それ以外はすべて区切り文字です。 ここでの課題は、遭遇する可能性のある区切り文字がわからないことです。 単語を構成する文字がわかっているので、リストにない場合は区切り文字であると見なすことができます。
パターンマッチングには、辞書の作成に使用する単語を見つけるための完璧なツールがあります。パットスパンとパットブレイク。使用できます言葉、ただし、各項目に埋め込まれた区切り文字を確認する必要があります。 パターンマッチングを使用すると、すべてを1つのステップで実行できます。 コードは以下のとおりです。 全体のプロセスは8〜9秒かかりました。 コードを別のテキストに適用するには、追加の文字を含めたり、ファイルを別のエンコーディングに保存したりするなど、微調整が必要な場合があります(utf-16を使用して拡張ASCII文字をキャプチャしました)。 お世話になりました@Craige_Hales私がそれを機能させるのに苦労した後、これを手伝ってくれて。 LesMisérablesのテキストファイルは、プロジェクトグーテンベルク。 あなたはそれを見つけることができますここ。
bigText = Load Text File("Les Misérables.txt");
aaLookup = Associative Array();
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZé´É";
wordLoc = 0;
Pat Match(bigText,
Pat Repeat(
(
Pat Pos() >> nextLoc
+ Pat Span( letters ) >> nextWord
+ Pat Test(
Try(
Insert Into(aaLookup[Lowercase(nextWord)],nextLoc),
aaLookup<<INSERT></INSERT>
良い! NS試す()連想配列に使用している構成Into()に挿入最初に既存の要素をテストするよりも高速な場合があります。
私が読書サークルに入るのに十分な若さだったとき、私のよく旅行した仲間の一人がその言葉で一節を読むようになりましたヨセミテ、私が遭遇したことのない。 彼の4音節の発音に驚いて、先生が嬉しそうに驚いているのに気づいたのを覚えています。
数年後、誰かが私に言うことができると言ったラメはロブですそして、注意を逃れるのに十分正しい演劇の名前を取得します。