for-loop에서 데이터 필터가 중지되었습니다.저는 다양한 실험 조건에서 수집된 스펙트럼의 일부에서 y-최대 피크의 x-값을 검색하는 for-loop 스크립트를 작성하고 있습니다. 하지만 한 라운드를 실행한 후 "선택 사항이 다른 창에서 변경되었습니다."라는 경고가 표시되면서 데이터 필터가 중단되었습니다. 스크립트를 원활하게 실행하여 for-loop를 완료하려면 어떻게 해야 합니까?
Big Class.jmp 예제를 사용하여 문제를 설명하겠습니다. 목표는 여러 키 범위(x 값 범위, 예를 들어 55-60, 60-62, 62-65)에서 최대 체중(y-최대값)을 가진 사람에 해당하는 데이터 하위 집합을 다른 연령대별로 보여주는 것입니다(실험 조건과 유사).
x-값 범위는 두 개의 목록으로 그룹화되는데, 하나는 하한을 포함하고 다른 하나는 상한을 포함합니다. 최대값은 Data Filter를 사용하여 Col Maximum으로 찾습니다. 계산은 목록을 따라 여러 x-값 범위에 대해 반복됩니다. 그러나 for i=1을 실행한 후 루프가 중지되고 Data Filter 경고가 나타납니다. 스크립트가 for-loop를 완료하도록 하려면 어떻게 해야 합니까?
Names Default To Here( 1 );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
for(i=1, i<=3, i++,
dt = Data Table( "Big Class" );
Current Data Table (dt);
a = ListA[i];
b = ListB[i];
dt << Data Filter(Add Filter(columns(:height), where(:height > a & :height < b)), Mode( Select( 0 ), Show( 0 ), Include( 1 )), Show Window(0), Auto Clear(1));
dt << select where (col maximum(:weight, :age, Excluded()) == :weight & :height > a & :height < b);
dt << subset(selected rows(1), columns({"name", "age", "sex", "height", "weight"}));
dt << Clear Row States;
dt << Clear Select();
);
자동화 및 스크립팅Re: for-loop에서 데이터 필터가 멈췄습니다.아래의 단순화된 JSL이 여러분이 원하는 것을 제공한다고 믿습니다.
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/big class.jmp" );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
For( i = 1, i <= 3, i++,
a = ListA[i];
b = ListB[i];
Current Data Table( dt );
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ) );
dt << select where( theMax == :weight & :height > a & :height < b );
If( N Rows( dt << get selected rows ) > 0,
dt << subset( selected rows( 1 ), columns( {"name", "age", "sex", "height", "weight"} ) )
);
dt << Clear Row States;
Wait( 0 );
);Re: for-loop에서 데이터 필터가 멈췄습니다.하지만 이 스크립트에는 "연령별" 기능이 없습니다. 예를 들어, 내 스크립트에서 i = 2(ListA = 60, ListB = 62)일 때 결과는 다음과 같습니다.
| 이름 | 나이 | 섹스 | 키 | 무게 |
| 제임스 | 12 | M | 61 | 128 |
| 앨리스 | 13 | F | 61 | 107 |
| 여자 이름 | 14 | F | 61 | 81 |
그러나 귀하의 스크립트는 해당 부분을 다음과 같이 제공합니다.
이는 내 스크립트에 Col Maximum에 "연령별" 부분이 있기 때문입니다. 불행히도, 스크립트에 "연령별" 부분을 추가하더라도:
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ), :age );
경고가 나타납니다: "잘못된 행 번호"
스크립트가 원활하게 실행됩니다. 스크립트의 Col Maximum에 "연령별" 부분을 어떻게 추가할 수 있습니까?
Re: for-loop에서 데이터 필터가 멈췄습니다.Col Max의 설명서를 살펴보세요. 실제로 필요한 모든 작업을 수행할 수 있습니다.
보조 열 height_bin(예: Transform Column을 통해)만 사용하면 됩니다. 데이터 필터는 필요 없습니다...

이 표에 따르면, 그들은 제임스, 바바라, 주디, 메리언입니다.
데이터 필터를 통해 height_bins를 정의하려면 연결 지점(예: height=60)을 놓치지 않도록 주의하세요.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "height_bin",
"Character",
Formula(
If(
:height < 60, "<60",
:height <62, "<62",
">=62"
)
) );
New Column( "weight_max",
Formula( Col Maximum( :weight, :age, :height_bin ) )
);
New Column( "is max",nominal,
Formula( :weight == :weight_max ),
);
Graph Builder(
Variables( X( :age ), Y( :weight ), Group Y( :height_bin ) ),
Elements( Bar( X, Y, Label( "Label by Row" ) ) ),
Local Data Filter( Add Filter( columns( :is max ), Where( :is max == 1 ) ) )
);