重複した行エントリを選択し、そのインデックスを保存して、重複した行を含まない新しいリストを作成します。こんにちは。
これは、このリンクの質問のフォローアップです: 解決済み: select where - JMP User Community から値を取得します。この説明の最後 (提供されたリンク内) では、show() 関数を使用して特定の行を選択し、それらを印刷する jsl の方法について説明します。別の投稿(リンクを失ってしまいました)では、Select Duplicated Row() 関数を使用して重複した行を選択し、それらを削除する方法がありました。
私の目的は、重複した行を選択し、テーブル内の選択した列のインデックスを取得することです。たとえば、大きなクラス テーブルの age 列の重複エントリを見つけたいとします。
2 番目の目的は、重複した行を削除せずに、一意の行のみを含む新しい列を作成することです。
ご指導いただければ幸いです。
dt_limit = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_limit:age << Select Duplicate Rows( Match (:age, :age ) );
Group1List = (dt_limit:age[dt_limit << get selected rows]);
theCount = N Rows( dt << get selected rows);
Show( Group1List);
自動化とスクリプト作成基本的なデータ分析とモデリングデータアクセスRe: 重複した行エントリを選択し、そのインデックスを保存して、重複した行を含まない新しいリストを作成します。ありがとう@Jed_Campbell 。これは良いですね、ありがとうございました!
さらなるアクションのために、その列をリストに取り込もうとしています。それについて手伝ってもらえませんか?ありがとう!
Re: 重複した行エントリを選択し、そのインデックスを保存して、重複した行を含まない新しいリストを作成します。スクリプトの最後に追加されたこの行により、その列がリストに追加されます。
future_list = as list (dt_limit:Unique << Get Values);
Re: 重複した行エントリを選択し、そのインデックスを保存して、重複した行を含まない新しいリストを作成します。ありがとう@Jed_Campbell 。全く問題なく動作します。
現時点で私が直面しているもう 1 つの問題は、1 つの列 (年齢) の代わりに、列のリスト ([年齢、身長、体重など]) がある場合はどうなるかということです。コードはどう変わるでしょうか?列と eval の組み合わせを使用して、リストのエントリを列として取得してみました。以下のコードが機能することはわかっていますが、列のリストに対して機能するようにコードを変更するにはどうすればよいでしょうか。 As column (ListOfTargetCol[i])[i] ) のようなものを持つことになります。 OR :(ListOfTargetCol[i])[i] ); jmp はリストの i 番目のエントリをフェッチし、次にその列 (列) の i 番目のエントリをフェッチすることを意味しますか?私は jsl を初めて使用するので、その構造がわかりません。この問題を克服する方法をアドバイスしてください。
参考までに、私は上で提供したものと同様のコードを使用し、次のようなものを追加してみました。 また、以下のような文字列の名前のリストである場合に何か異なるかどうかにも興味があります。どうもありがとう!
ListOfTargetCol = { age, height, weight};
StringOfTargetCol = { "age", "height", "weight"};
... dt_limit:Unique[i] = dt_limit:( As coulmn(ListOfTargetCol[1])) [i]...
Re: 重複した行エントリを選択し、そのインデックスを保存して、重複した行を含まない新しいリストを作成します。このようなものをお探しですか?もっと洗練された方法があるかもしれませんが、ここでは最初の一意の行だけを含む新しい列を作成する 1 つの方法を紹介します。
dt_limit = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_limit << Select Duplicate Rows( Match (:age ) );
Group1List = (dt_limit << get selected rows);
theCount = N Items (Group1List);
//create a new column that has only the unique rows without deleting the duplicated row
dt_limit << Invert Row Selection;
UniqueList = dt_limit << Get Selected Rows;
dt_limit << new column ("Unique");
for each ({i}, UniqueList,
dt_limit:Unique[i] = dt_limit:age[i]
);Re: 重複した行エントリを選択し、そのインデックスを保存して、重複した行を含まない新しいリストを作成します。選択が必要ない場合は、数式/要約 (またはその他の多くのオプション) を使用することもできます。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;
// Option2
dt << New Column("Row", Numeric, "Continuous", Formula(Row()));
dt_summary = dt << Summary(
Group(:age),
Min(:Row),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
dt_summary << Delete Columns("N Rows");
Column(dt_summary, 1) << Set Name("R2");
dt << Update(With(dt_summary), Match Columns(:Row = :Row));
Close(dt_summary, no save);

Re: 重複した行エントリを選択し、そのインデックスを保存してから、重複した行を含まない新しいリストを作成します。ご協力いただきありがとうございます@jthi ! どちらの解決策もうまく機能しますが、使用すべき構文についてはまだ混乱しています。
In the loop below, we have the dt:age[i] which iterates through the "age" column in the dt_limit loop. <BR />What if I want to have more than one column to iterate through.<BR /><BR /> The only solution I can find (and works with no error) is to copy past the loop for <BR />all the needed columns i.e. age, height, ..etc. It is just not efficient and will not work for a large number of columns. <BR /><BR />Any suggestions would be appreciated.
<BR />
for each ({i}, UniqueList,
dt_limit:Unique[i] = dt_limit:age[i]
);Re: 重複した行エントリを選択し、そのインデックスを保存してから、重複した行を含まない新しいリストを作成します。何をしようとしているのかよく分かりません。Col Minにbyvarsとして列を追加することができます。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age, :sex), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;

最小列(名前, )
Re: 重複した行エントリを選択し、そのインデックスを保存してから、重複した行を含まない新しいリストを作成します。@jthi さん、ありがとうございます。確かにそうですね。上で提案したように、列を追加するだけで済みます。ただし、私はソリューションを一般化しようとしています。私がやろうとしているのは、評価する列をユーザーから入力してもらうことです。それらをリストに配置します。そして、それらすべてを評価します。たとえば、ユーザーは年齢と身長のみを選択できます。コードはできるだけ柔軟にする必要があります。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
TargetList = {age, sex, height};
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age, :sex), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;Re: 重複した行エントリを選択し、そのインデックスを保存してから、重複した行を含まない新しいリストを作成します。式を使って数式を構築することができます
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
sel_cols = {"age", "sex", "height"};
colmin_expr = Expr(Col Min(Row()));
For Each({sel_col}, sel_cols,
Insert Into(colmin_expr, Name Expr(AsColumn(dt, sel_col)))
);
Eval(Substitute(
Expr(new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == _colminformula_, :age, .)
))),
Expr(_colminformula_), Name Expr(colmin_expr)
));
dt << Run Formulas;
new_col << Delete Formula;
また、リストの入力に対応するように要約バージョンを変更することもかなり簡単にできるはずです。