조건에 따른 행 간 계산안녕하세요, 저는 JMP 스크립팅을 처음 접했지만 파이썬 언어에 어느 정도 익숙합니다. 아래 더미 테스트 테이블로 다음을 달성하려고 합니다.
1) 모든 행(행 앞뒤 모두)을 순환하며 Cuvette == 11인 행에 대해서만 계산을 수행하고, Cuvette != 11인 나머지 행에서는 "출력"을 NA 또는 그 이상으로 설정할 수 있습니다.
2) 계산 자체는 두 개의 별도 행 사이에 있습니다. Cuvette == 11인 행에서 행의 850nm 셀은 두 가지 조건을 충족하는 행의 250nm 셀과 나누어야 합니다.
a) 큐벳 == 12
b) 통과 값은 행 사이에서 일치해야 합니다. 예: 큐벳 11의 통과 값 == 큐벳 12의 통과 값
| 통과하다 |
850nm |
250nm |
큐벳 |
산출 |
| 1 |
100 |
200 |
11 |
100/500 = 0,2 |
| 2 |
400 |
500 |
11 |
400 / 400 = 1 |
| 3 |
300 |
100 |
11 |
300 / 900 = 0.33 |
| 1 |
700 |
500 |
12 |
저것 |
| 2 |
200 |
400 |
12 |
저것 |
| 3 |
400 |
900 |
12 |
저것 |
| 1 |
400 |
800 |
13 |
저것 |
| 2 |
500 |
700 |
13 |
저것 |
| 3 |
300 |
700 |
13 |
저것 |
자동화 및 스크립팅기본 데이터 분석 및 모델링Re: 조건에 따른 행 간 계산JMP에서 이 작업을 수행하는 방식으로, 일반적으로 데이터를 분할한 다음 계산을 수행합니다( JMP는 스프레드시트가 아닙니다 ). 그런 다음 다시 결합하거나 분할된 데이터를 계속 진행합니다.
하지만 JSL이나 Formula를 사용하여 이 계산을 할 수도 있지만, 먼저 분할 옵션을 고려해 보세요.
Re: 조건에 따른 행 간 계산커뮤니티에 오신 것을 환영합니다.
다음은 내가 귀하의 문제에 접근하는 방법의 예입니다.

Names Default To Here( 1 );
dt = Current Data Table();
// Separate out the Cuvette==12 rows into a separate data table
// and then join the Pass==Pass rows to the Cuvette==11 rows
// Then calculate the Output column
// Select the Cuvette==12 rows
dt << Select Where( :Cuvette == 12 );
// Create a new subsetted data table with those rows
dt12 = dt << Subset( Selected Rows( 1 ), columns( :Pass, :"250 nm"n ) );
// Change 250 nm column name so when joined back to original table
// it will have a unique column name
dt12:"250 nm"n << Set Name( "Divisor" );
// For alignment reasons, add a new column called Cuvette and set
// it equal to 11
dt12 << New Column( "Cuvette", Set Each Value( 11 ) );
// Join the tables using the Update Platform
dt << Update(
With( dt12 ),
Match Columns( :Pass = :Pass, :Cuvette = :Cuvette )
);
// Create the new Output column
dt << New Column( "Output", Set Each Value( :"850 nm"n / :Divisor ) );
// Remove Divisor column since it is no longer needed
dt << delete columns( Divisor );
// Close the subsetted data table since it is no longer needed
Close( dt12, nosave );
// Remove the Selected RowStates from the data table
dt << clear rowstates;
아래는 더 직접적인 접근 방식이지만 훨씬 비효율적인 방법으로 동일한 결과를 낳습니다. 큰 데이터 테이블에서는 이 방법이 매우 느릴 것입니다.
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Output",
Formula(
foundRow = [];
If( :Cuvette == 11,
curPass = :Pass;
foundRow = Current Data Table() <<
get rows where( :Cuvette == 12 & :Pass == curPass );
If( N Items( foundRow ) > 0,
:"850 nm"n / :"250 nm"n[foundRow[1]]
);
);
)
);
Re: 조건에 따른 행 간 계산여기에는 하나의 매트릭스 옵션이 있지만 일반적으로 JMP 기능을 사용하는 것이 이해하기 더 쉽습니다.
Names Default To Here(1);
dt = Current Data Table();
cuvette_start = 11;
cuvette_end = 12;
cuvettes = dt[0, "Cuvette"];
// Data is sorted -> we can just take values and make comparison
start_idx = Loc(cuvettes, cuvette_start);
end_idx = Loc(cuvettes, cuvette_end);
// differences
output = J(1, N Rows(dt), .);
output[start_idx] = dt[start_idx, "850 nm"] :\</img> dt[end_idx, "250 nm"];
dt << new column("R", Numeric, Continuous, Values(output));
만약 주문에 크게 의존할 수 있다면 이런 공식을 사용하면 됩니다.
If(:Cuvette == 11,
:"850 nm"n / :"250 nm"n[Col Min(If(:Cuvette == 12, Row(), .)) + Row() - 1];
);
최종 공식의 유형은 실제 사용 사례에 따라 크게 달라집니다(데이터가 "적절하게" 정렬되었는지, 두 개 이상의 값을 비교하고 있는지 등).