2개의 데이터 테이블 간에 동일한 이름의 열 비교<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />동일한 이름의 숫자 열을 포함하는 2개의 데이터 테이블이 있습니다.
테이블 전체의 열 이름과 행의 고유 식별자를 비교하는 스크립트를 실행하고 싶습니다. 일치하면 간단한 계산(두 숫자 간의 % 차이)을 실행하고 결과가 있는 다른 테이블을 반환해야 합니다.
비교 테이블을 사용하려고 시도했지만 필요한 계산을 허용하지 않습니다.
내가 사용할 수있는 비슷한 작업을 수행 한 사람이 있습니까?
누군가 나를 도울 수 있다고 생각하는 경우를 대비하여 샘플 파일 2개를 첨부했습니다.
다윗
Re: 2개의 데이터 테이블 사이에서 같은 이름의 열 비교jsl을 사용하여 이 절차를 자동화하는 방법에는 여러 가지가 있습니다. 여기에 게시된 두 테이블에 대해 작동해야 하는 한 가지 시도가 있습니다. 테이블 이름과 ID 열은 여기에 하드 코딩되어 있지만 사용자가 테이블을 선택할 수 있는 대화 상자를 쉽게 구현할 수 있습니다. 코드는 물질 열의 수 또는 이름 지정에 대해 작동해야 합니다(그러나 물질 열의 수와 순서는 두 테이블에서 동일해야 합니다).
// 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를 얻었습니다.
두 데이터 테이블 비교
다음은 두 개의 데이터 테이블을 열고 비교하고 모든 결과를 로그 창에 보고하는 스크립트입니다. 이것
스크립트는 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개의 열을 확인해야 하므로 자동화 방법, 심지어 반자동화도 이 절차가 선호됩니다. 두 테이블을 결합하면 열 이름이 동일하지 않아 자동화가 더 어려워질 수 있습니다.
Re: 2개의 데이터 테이블 사이에서 같은 이름의 열 비교이 작업을 얼마나 자주 수행해야 하는지 잘 모르겠습니다.
이 두 테이블을 결합하고 수식을 사용하여 이 두 열의 각 행에 대한 빼기 계산을 수행하는 것이 좋습니다.
데이터가 고정된 행 순서에 있다고 가정합니다.