동일한 테이블의 다른 열에서 기준과 일치하는 열을 선택하는 더 좋은 방법은 무엇입니까?이 게시물 끝에 있는 스크립트는 기본적으로 내가 원하는 작업을 수행하지만(예: 시간 = 0에 대해 Y 값이 100인 열 찾기) 나를 약간 불편하게 만드는 로그 메시지도 생성합니다. 이전에 함정에 빠졌습니다):
A message with an empty Boolean argument enabled an option that was already enabled. That option remains enabled. In previous versions of JMP, this would have disabled the option.
이 메시지는 루프 구성의 일부로 이미 한 번 선택된 후 다시 선택되는 모든 열에 대한 로그에 인쇄됩니다. 스크립팅을 처음 접하는 사람으로서 저는 두 가지 주요 관심사를 가지고 있습니다.
- 이 로그 메시지는 반드시 피해야 하는 메시지이며 문제가 발생합니까? 결국 더 큰 테이블을 처리하게 되므로 이 로그 메시지는 단일 스크립트 실행에 대해 수백 번 인쇄될 수 있습니다.
- 시간 = 0인 각 행에 대해 Y 값 = 100을 갖는 테이블의 모든 열을 찾는 더 스마트한 방법이 있습니까? (저의 경우에는 많은 열이 있는 테이블을 처리할 것입니다. 그 중 일부는 시간 =0에서 100% 상대값으로 정규화된 결과를 포함합니다. 제가 관심을 갖고 있는 칼럼입니다.)
Names Default To Here( 1 );
// table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, 100, 200, 325, 490] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [100, 50, 33, 0, 100, 113, 150, 94] ),
)
);
// selecting columns where for :time == 0 a Y-value == 100 is found
For( i = 1, i <= N Row( dt ), i++,
For( j = 1, j <= N Col( dt ), j++,
If( Column( j )[i] == 0,
For( k = 1, k <= N Col( dt ), k++,
If( Column( k )[i] == 100,
Column( k ) << Set Selected
)
)
)
)
);
결과 공유 및 전달Re: 동일한 테이블의 다른 열에서 기준과 일치하는 열을 선택하는 더 좋은 방법은 무엇입니까?FWIW, 이는 하위 집합 테이블을 피하지만 아마도 훨씬 빠르지는 않습니다.
Names Default To Here( 1 );
// table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, 100, 200, 325, 490] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [100, 50, 33, 0, 100, 113, 150, 94] ),
)
);
// Rows that have time = 0
r0 = dt << getRowsWhere(:time == 0);
// Loop over other columns (assumes time is in the first column)
for(c=2, c<=NCol(dt), c++,
if(Contains(Column(dt, c)[r0], 100), Column(dt, c) << setSelected(1));
);
Re: 동일한 테이블의 다른 열에서 기준과 일치하는 열을 선택하는 더 좋은 방법은 무엇입니까?다시 감사합니다. 하위 집합을 사용하면 실제(대형) 테이블의 성능이 향상되었습니다. 아래에 개선된 솔루션이 게시되어 있습니다. 전에도 이것에 대해 생각해 본 적이 있었지만 거기에 도달하려면 분명히 짧은 휴식이 필요했습니다. 내가 고려조차 하지 않은 것은 열 목록을 작성하고 항목을 반복적으로 제거하는 것이었습니다. 그 점 또한 감사드립니다!
Names Default To Here( 1 );
// new table required for example
dt = New Table( "Results (absolute & relative) vs time",
Add Rows( 8 ),
New Column( "time",
Numeric,
Set Values( [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] ),
),
New Column( "Y1_absolute",
Numeric,
Set Values( [7, 8, 1, 9, 0.2, 0.4, 0.65, 0.98, 0.7, ., 0.83, 0.4] ),
),
New Column( "Y1-relative",
Numeric,
Set Values( [100, 114, 14, 129, ., 200, 325, 490, 100, 330, 540, 213] ),
),
New Column( "Y2_absolute",
Numeric,
Set Values( [12, 6, 4, 0, 80, 90, 120, 75, 8.3, 9.7, 6.4, 5.2] ),
),
New Column( "Y2_relative",
Numeric,
Set Values( [., 50, 33, 0, 100, 113, 150, 94, 100, 66, 37, 12] ),
)
);
// finding and selecting Y columns where for any :time == 0 a value of 100 is found in the same row
dt << Select Where( dt:time == 0 );
dtTemp = dt << Subset ( Selected Rows, Selected Columns Only( 0 ) );
For( i = 1, i <= N Row( dtTemp ), i++,
For( j = 1, j <= N Col( dtTemp ), j++,
If( Column( dtTemp, j )[i] == 100,
Column( dt, j ) << Set Selected( 1 ),
)
)
);
Close( dtTemp, no save );
dt << Clear Select( );
Re: 동일한 테이블의 다른 열에서 기준과 일치하는 열을 선택하는 더 좋은 방법은 무엇입니까?몇 가지 아이디어:
루프를 진행하기 전에 time=0에서 테이블의 부분 집합을 시도해 볼 수 있습니다. 그러면 for 루프의 한 레이어가 풀립니다.
열 목록을 작성하고 선택한 항목을 제거할 수 있습니다. 그러면 다음 반복마다 선택되지 않은 나머지 열만 반복하면 됩니다.
Re: 동일한 테이블의 다른 열에서 기준과 일치하는 열을 선택하는 더 좋은 방법은 무엇입니까?매우 감사! 나는 그 루프를 조금 더 편집할 것이라고 생각합니다.
- 올바른 열이 식별되면 전체 테이블을 탐색할 이유가 없습니다. (편집: 현재 기술 수준으로는 하기가 약간 어려울 수 있습니다. 서로 다른 Y 열에는 서로 다른 행에 누락된 값이 있을 수 있습니다. 시간 = 0이 하나 이상의 Y 값 = 100과 일치하는 모든 Y 열을 찾아야 합니다.)
- 시간이 실제로 0인 행뿐만 아니라 모든 행을 반복하는 이유는 무엇입니까?
편집: 제시된 솔루션을 유지했습니다. 튼튼해 보이고 아직 더 많은 시간을 사용하고 싶지 않았습니다. 그러나 글머리 기호 #2, 즉 테이블의 모든 행을 반복하지 않는 것은 내가 해야 할 일이며 아마도 어느 시점에서 조사할 것입니다.
Re: 동일한 테이블의 다른 열에서 기준과 일치하는 열을 선택하는 더 좋은 방법은 무엇입니까?<< set selected 뒤에 (1)을 추가하면 오류 메시지가 처리됩니다. 토글하는 대신 원하는 최종 상태를 정의합니다.
For( i = 1, i <= N Row( dt ), i++,
For( j = 1, j <= N Col( dt ), j++,
If( Column( j )[i] == 0,
For( k = 1, k <= N Col( dt ), k++,
If( Column( k )[i] == 100,
Column( k ) << Set Selected(1)
)
)
)
)
);