あるテーブルの列コードを別のテーブルデータセットにリンクする方法みなさんこんにちは。データ テーブルが 2 つあります。データセット テーブル「Dataset.jmp」には、コード「ENICITY」と「ETHCAT」の列データがあり、これをデータセット「Dictionary.jmp」にリンクして、コードをラベル (辞書ファイルのラベル列) に変換する必要があります。実際のデータセットには 50 のカテゴリがあるため、すべてのカテゴリで「値ラベル」関数を使用することはできません。1 つのテーブルの行を別のテーブルの列に正確な値でリンクする方法はありますか? 必要な列は、Dataset.jmp ファイルの結果列です。
ここにファイルを添付しました。
どうもありがとうございます!
最高、
基本的なデータ分析とモデリングRe: あるテーブルの列コードを別のテーブルデータセットにリンクする方法match f では、変更がある列をリストするだけで、残りの列は「col」(最後のエントリ) のままになります。
マッピングを作成したくない場合は、列と辞書に一致する名前を使用します。
または、一貫したマッピング (列名の最初の文字、または最初の 2 文字など) と対応する方程式を使用します。
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法ありがとうございます、Hogiさん。ただし、私たちが持っているすべての列(50 列以上)を再入力する必要がないスクリプトを提供できますか?
ありがとう !
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法別の方法として、サブセット化/For Each を使用しない場合:
names default to here(1);
dict = Open( "$DOWNLOADS/Dictionary1.jmp" );
dt = Open( "$DOWNLOADS/Dataset1.jmp" );
// stack the data for easy application of the dictionary
dt2=dt << Stack(
columns(
:ETHNICITY, :ETHCAT, :SEX, :NAME, :"A09:05"n, :"A01:01"n, :DPA05, :DPB04
),
Source Label Column( "col" ),
Stacked Data Column( "values" )
);
// add a column with the corrected column-identifiers
dt 2 << New Column( "column",
Character,
Formula(
Match( :col,
"A01:01", "A",
"A09:05", "A",
"DPA05", "DP",
"DPB04", "DP",
:col
)
)
);
<BR />// add the labels from the disctionary
dt2 <<
Update(
With( dict ),
Match Columns( :column = :Column, :values = :Values ),
Add Columns from Update Table( :Labels )
);<BR />
// convert back to a wide table
dt2 <<
Split(
Split By( :col ),
Split( :Labels ),
Group( :ID ),
Remaining Columns( Drop All )
);
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法この場合、適切なサブセットを取得するためのマッピングを追加します (例: Jarmos コード)。
colMapping = Associative array({{"SEX","SEX"},{"NAME","NAME"},{"A09:05","A"},{"A01:01","A"},{"DPA05","DP"},{"DPB04","DP"}});
colIndex= colMapping[col];
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == colIndex)), Selected Columns(0), Invisible);
代替案: Recode には、あなたが望むものにかなり近い機能があります:テーブルからマッピングを適用する


現時点では、適切なサブセットを指定する設定はありません。したがって、このようなマッピングを定期的に適用する場合 (他のユーザーも同様)、このような設定によって機能を強化するための要望をウィッシュ リストに投稿することをお勧めします...
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法ジムとジャルモ、ありがとう。
ディスカッション コミュニティから多くのことを学びました。ご協力ありがとうございます。やりたいことに関連するトピックを見つけようとしましたが、このコミュニティから回答を得ることができました。JIM とあなたが提供してくれたスクリプトはうまくいきました。ただし、実際のデータは例よりも複雑です。たとえば、データセット内の複数の列で同じ辞書を使用する場合、新しいデータセット 1 と辞書 1 を添付した場合などです。1 つの列が同じパターンで他の列と共有されている場合、スクリプトを修正できますか? たとえば、辞書 A と列 A01、A08、A9 などです。
新しいデータセットをここに添付しました。
最高、
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法私は間違いなく、Jim が提供したソリューションから始めます。これは、JMP が提供する JSL をより多く活用しているからです。しかし、これは私が JSL と JMP について多くの経験を積んだ後に書くものです (私の仕事の一部は、スクリプトを使用して JMP を自動化し、JSL を使用して JMP に追加機能を追加することです...)
もっと見る...
Names Default To Here(1);
dt_data = Open("$DOWNLOADS/Dataset.jmp");
dt_dict = Open("$DOWNLOADS/Dictionary.jmp");
Column(dt_dict, "Values") << Set Data Type("Numeric");
/*
// Not really sure if this "fix" should be done or not
missing_rows = Loc(dt_dict[0, "Values"], .);
If(N Rows(missing_rows) > 0,
dt_dict[missing_rows, "Values"] = 0;
);
*/
Summarize(dt_dict, cols = By(:Column));
For Each({col}, cols,
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == col)), Selected Columns(0), Invisible);
Column(dt_dict_subset, "Labels") << Set Name("Result " || col);
dt_data << Update(
With(dt_dict_subset),
Match Columns(Eval(col) = :Values),
Add Columns from Update Table(Eval("Result " || col))
);
Close(dt_dict_subset, no save);
);
Write();
まず、Jim が提供したオプションを完全に理解する必要があります。その後、次のようなものを利用することを検討し始めることができます (プログラミングをある程度理解している場合)。これは基本的に、 JMP が提供できるコードのほとんどをスキップすることになります (Open() と << Update のほとんどは JMP が提供しています)。
JSLとJMPの自動化方法を学習したい場合は、前の手順を実行する前に私のソリューションに直接スキップしないでください。
- 純粋にJMPが提供するスクリプトから始める
- 少し改善する(例えば、「ハードコードされた」テーブル名の代わりに変数を利用する)
- ミックスに「プログラミング」を追加し始めます。これは、ジムのソリューションが属すると考えられる部分です (たとえば、JMP ではおそらく提供できないループや Word() 関数の使用など)
- 最終的には、JMP が提供する JSL (テーブルを開く、テーブルを更新する)を部分的に利用している私のソリューションのようなものになります。
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法これは、あなたが望むものの良いスタートです。これを拡張して、最終的な要件との矛盾を満たすことができるはずです。
JMP ヘルプの下にあるスクリプト ガイドをまだ読んでいない場合は、ぜひ読んでみてください。また、以下の例を必ず読んで、関数とステートメントのロジックと詳細を理解してください。
names default to here(1);
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
dt = Open( "$Downloads/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
dtDict = Open( "$Downloads/Dictionary.jmp" );
/*// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );*/
// Change column modeling type: Values
Data Table( "Dictionary" ):Values << Set Modeling Type( "Continuous" );
// Create a new dictionary data table for each level of the Column column
dtDictList = dtDict << Subset(
By( :Column ),
All rows,
Selected columns( 0 ),
Selected rows( 0 )
);
/*// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );*/
// Clear row selection
//Data Table( "Dataset.jmp" ) << Clear Select;
dt << Clear Column Selection();
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
/*// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );*/
For Each( {thedt, index}, dtDictList,
// Get the dataset column to join with
joinColumn = Word( 3, Char( thedt ), "=\!"" );
// Join data tables
// → Data Table( "untitled 1925" )
newDT = dt << Join(
With( thedt ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( Column( joinColumn ) = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 ),
Output Table( "Join of Dataset with Column=ETHCAT" )
);
NewDt:Labels << set name( joinColumn || " Labels" );
NewDt:Values << set name( joinColumn || " Values" );
If( index > 1,
Close( dt, nosave )
);
dt = newDT;
);Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法こんにちは、ジム。どうもありがとうございます。あなたの提案はうまくいきました。しかし、異なるカテゴリ(ETHCAT、ETHNICITY など、5 から 30 のグループ)の 150 行の辞書があり、データセット テーブルに 300 列と結合する必要がある列があるとします。正直に言うと、それを手動で行うのは難しく、結合するテーブルが複数あります。1 つの辞書ファイルで同じものを分類する方法と、1 つのファイルのみの辞書でデータセットのすべての列を結合する方法に関するスクリプトを提供できますか。これは私が実行しようとしているスクリプトです。ただし、スクリプトを変更することはできません。
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
Open( "$DOWNLOADS/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
Open( "$DOWNLOADS/Dictionary.jmp" );
// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Change column info: Values
Data Table( "Subset of Dictionary 2" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Clear row selection
Data Table( "Dataset.jmp" ) << Clear Select;
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );
// Join data tables
// → Data Table( "untitled 1925" )
Data Table( "Dataset.jmp" ) << Join(
With( Data Table( "Subset of Dictionary 2" ) ),
By Matching Columns( :ETHCAT = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
どうもありがとう、
最高、
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法行と列の数によって問題が生じるのはなぜでしょうか。異なるルックアップ (ETHCAT、ETHNICITY など) の数が多い場合は、サブセット化とマージをループに配置する必要があります。ただし、最初は 1 つまたは 2 つのグループに対して対話的に実行し、次に JMP がそれらの操作を実行するために生成する JSL を取得して、スクリプトに配置します。その後、ステップのループをスクリプトに追加できます。
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法列のプロパティを介して仮想結合を使用できます。
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法こんにちは、ジムさん。アイデアをありがとうございます。ただし、列が 50 列以上、行が 1000 行以上あるのですが、もっと大きなデータセットについて何かアイデアはありますか?
最高、
Re: あるテーブルの列コードを別のテーブルデータセットにリンクする方法調べる
テーブル=>結合
データ テーブル ディクショナリを列列でサブセット化し、ETHCAT と ETHNICITY のテーブルを作成します。値列を数値列に変更します。ETHNICITY データ テーブルでは、Null または Missing を 2 行に拡張し、値の 1 行に . の値、もう 1 行に 0 の値を設定する必要があります。
サブセット化された各テーブルを、dataset というデータ テーブルに結合します。1 つのテーブルでは ETHNICITY と Value を結合し、2 番目のテーブルでは ETHCAT と Value を結合します。