配列を文字列に変換するこんにちは、みんな、
別のテーブルの配列から値を取得し、それを選択の値として使用しようとしています。 配列を文字列に変換する方法はありますか?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
高度な統計モデリングマスカスタマイゼーションRe: 配列を文字列に変換するクレイジ
もう一度、JMP について新しいことを学びました。当初は Contains() 関数を使用してコードを作成していましたが、次に Loc() 関数を使用するように変更しました。
Contains( "BARBARA ANN", "BARBARA")
True を返します。
Contains の比較コンポーネントが項目の JMP リストである場合、(間違って判明しましたが)、
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
これも True を返しますが、False を返します。これは、絶対一致を意味します。
素晴らしい情報をありがとう
Re: 配列を文字列に変換する改めて、質問の核心を突くジムの能力に驚かされました。 ここにある 2 つの優れたコードについては、さらに長い説明が必要です。
これは何をするのでしょうか?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1はデータテーブル参照です。 "名前"文字列としての列の名前 (文字通り「NAME」ですが、変数に含めることもできます)、桁関数は列参照を返します。 の<<値を取得するメッセージは、重複を含むすべての値を列から取得します。 の連想配列関数は一意の値のセットを作成し、 <<キーを取得メッセージは一意の値を返します。 (よくやった@29755 。)
この?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
の<<どこを選択してくださいメッセージは各行に対して作用します。マージされたファイル、引数がゼロ以外の場合、一度に 1 つずつ行を選択します。
のloc()関数はインデックスの行列を返します。 リストを検索します名前キー:Name_final の出現の場合。 結果の行列には 0 行以上の行を含めることができますが、この例ではキーが一意であるため、0 行または 1 行になります。 のnrows()関数は 0 または 1 を返し、その後 >0 と比較され、0 または 1 のままになります。 したがって、:Name_final が ref_file_1:NAME のリストにある場合、行が選択されます。
別:
name_key に >1e6 の名前があり、merge_file に >1e7 行があった場合はどうなるでしょうか? パフォーマンスはどのようなものになるでしょうか? loc 関数は大量の検索を行います。 1e13 文字列を比較します。 待つのは疲れてしまうでしょう。 これを修正するには、次のように連想配列を使用します。
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
現在、nameSet には 1e7 ルックアップのみがあります。 これらは無料ではありませんが、1e6 項目を順番にチェックするよりもはるかに高速です。 それぞれ約 20 件の比較が行われると思います (log2(1e6))。 これは、次のメンテナにとっても従うのが簡単になる可能性があります。
(未テスト。 修正大歓迎です!)
Re: 配列を文字列に変換するこれであなたが望むものを手に入れることができると思います
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);