2 つのデータ テーブル間で同じ名前の列を比較する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />同じ名前の数値列を含む 2 つのデータ テーブルがあります。
テーブル全体の列名と行の一意の識別子を比較するスクリプトを実行したいと考えています。それらが一致する場合、単純な計算 (2 つの数値の差 %) を実行し、結果を含む別のテーブルを返す必要があります。
比較テーブルを使用しようとしましたが、必要な計算ができません。
誰かが私が使用できる同様のことをしましたか?
誰かが私を助けることができると感じた場合に備えて、2 つのサンプル ファイルを添付しました。
デビッド
Re: 2 つのデータ テーブル間で同じ名前の列を比較するjsl を使用してこの手順を自動化する方法は多数あります。 ここに投稿された 2 つのテーブルで機能するはずの 1 つの試みを次に示します。 ここでは、テーブルの名前と ID 列がハードコーディングされていますが、ユーザーがテーブルを選択できるダイアログは簡単に実装できます。 このコードは、物質列の数や名前に関係なく動作するはずです (ただし、物質列の数と順序は 2 つのテーブルで同じでなければなりません)。
// Define table variables, dt1, the table with least number of rows used as reference
dt1 = Data Table( "List Report -1.jmp" );
dt2 = Data Table( "List Report -2 rows.jmp" );
// Define id columns
idcol1 = Column( dt1, 1 );
idcol2 = Column( dt2, 1 );
//Get matching rows
m = J( N Row( dt1 ), 2, . );
For( i = 1, i <= N Row( dt1 ), i++,
mi = dt2 << get rows where( idcol2[] == idcol1[i] );
If( N Row( mi ) > 0,
m[i, 2] = mi[1]
);
m[i, 1] = i;
);
//Make matrix with differences for between matching rows for each substance (edit this formula to get e.g. %)
diff = (dt1 << get asmatrix)[m[0, 1], 0] - (dt2 << get asmatrix)[m[0, 2], 0];
// Put matrix into a new table
dt_diff = New Table( "Difference of matched", New Column( "Matched Substance Identifier", character, values( idcol1[m[0, 1]] ) ) );
dt_diff << set matrix( diff );
//Set column names
colnames = dt1 << get column names( string );
For( i = 2, i <= N Items( colnames ), i++,
Column( dt_diff, i ) << set name( colnames[i] )
);
Re: 2 つのデータ テーブル間で同じ名前の列を比較するこれがうまくいくことを願っています。 jmp8 スクリプト ガイドから if を得たので ...
2 つのデータ テーブルを比較する
2 つのデータ テーブルを開いて比較し、すべての結果をログ ウィンドウに報告するスクリプトを次に示します。 これ
スクリプトは For 演算子を多用して、ネストされたすべての行に対して操作をループします (i でループします)。
別の For 演算子を使用して、すべての列に対して操作をループします (j でループします)。
/* COMPARE THE CONTENTS OF TWO DATA TABLES */
// First identify the two data tables to be compared.
// Since you don't specify arguments, Open() presents the
// host-system dialog box for opening a file.
caption("Please locate the first data table.",spoken(1));
dt1=open();
caption("Please locate the second data table.");
dt2=open();
// Check for differing sizes.
if(nrow(dt1)!=nrow(dt2),
write("Differing number of rows. "),
write("Same number of rows. "));
if(ncol(dt1)!=ncol(dt2),write("Differing number of columns. "),
write("Same number of columns. "));
nr = min(nrow(dt1),nrow(dt2));
nc = min(ncol(dt1),ncol(dt2));
// Check for differing column names.
for(j=1,j<=nc,j++,
current data table(dt1);n1=char(ColumnName(j));
current data table(dt2);n2=char(ColumnName(j));
if(n1!=n2,
write("\!rDiffering column names in column "||char(j));
show(n1,n2)));
// check for differing values
e=0;
for(i=1,i<=nr,i++,
for(j=1,j<=nc,j++,
v1 = Column(dt1,j);
v2 = Column(dt2,j);
if(v1!=v2,
write("\!rDiffering values at row "||char(i)||
" in column "||char(j));show(v1,v2);e++)));
if(e==0,
write("Matching cells have the same values."),
write("\!rNumber of cells that exist in both tables ");
write("and have differing values: "||char(e)));
// check for differing row states
for(i=1,i<=nr,i++,
current data table(dt1);r1 = char(rowstate(i));
current data table(dt2);r2 = char(rowstate(i));
if(r1!=r2,
write("\!r\!rDiffering row states at row "||char(i));
show(r1,r2)));
//Observe how Current Data Table is used to switch between two open windows.
Re: 2 つのデータ テーブル間で同じ名前の列を比較する私はこれをかなり頻繁に行う必要があり、時には最大 200 列を確認する必要があるため、半自動化であっても自動化する方法として、この手順が推奨されます。 2 つのテーブルを結合すると、列名が同じではないため、自動化がより困難になる可能性があります。
Re: 2 つのデータ テーブル間で同じ名前の列を比較するこの作業をどのくらいの頻度で行う必要があるかわかりません。
これら2つのテーブルを結合し、式を使用してこれら2列の各行のマイナス計算を行うことをお勧めします.
データが行の固定シーケンスにあると仮定します。