데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.
안녕하세요 여러분,
기본 키와 외래 키를 사용하여 조인한 두 개의 데이터 테이블을 작업하고 있는데, 두 테이블에는 수천 개의 데이터가 있습니다. 제 목표는 이 테이블의 값을 드롭다운(현재는 콤보박스 사용)에 표시하고, 선택 항목을 기반으로 하위 집합 또는 전치 테이블을 동적으로 생성하는 것입니다.
Currently, I’m using ComboBox to populate unique values from the data tables, but performance is quite slow and especially with larger datasets. I’ve found that JMP’s built-in Data Filter is powerful but not very customizable for UI integration.
데이터 필터 엔진을 백그라운드에서 활용하여 사용자 지정 UI 드롭다운에 연결할 방법이 있을까요? 아니면 JSL 드롭다운으로 반응형 동적 필터링을 구현하는 더 효율적인 방법이 있을까요?
어떤 제안이나 예시라도 감사히 받겠습니다!
미리 감사드립니다.
자동화 및 스크립팅기본 데이터 분석 및 모델링Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.JMP19의 새로운 필터 뷰를 살펴보세요.
데이터 테이블 자체와 테이블 오른쪽의 필터 보기를 사용할 수도 있습니다.

원하는 뷰가 나오면 새 테이블로 열기만 하면 됩니다.
자세한 내용은 이 강연에서 확인할 수 있습니다: 개발자 튜토리얼: @맨디_챔버스 의 데이터 테이블 개선 .
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.이전 버전의 JMP에서 JMP 19로 이전하고 있습니다. 따라서 이 솔루션은 이전 버전에서는 작동하지 않습니다. 드롭다운에서 많은 데이터를 더 빠르게 표시하는 방법에 대한 아이디어가 있으신가요? 데이터 필터는 더 빠르지만 UI는 사용자 정의가 쉽지 않습니다.
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.어떤 부분이 느린가요? 콤보 상자를 만드는 것인가요? 값을 검색하는 것인가요? 하위 집합을 만드는 것인가요?
최적화할 수 있는 부분이 있을 것 같아 예제 스크립트를 공유해 주시겠습니까?
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.
내가 하는 일:
1. 두 개의 큰 데이터 테이블 로드(하나는 100k+ 행)
2. 키를 맞춰서 연결하기
3. 모든 필터 열에서 고유한 값을 추출하여 별도의 캐시 테이블에 저장합니다.
4. 여러 개의 ComboBox 드롭다운을 사용하여 사용자 지정 UI 만들기(총 13개 필터)
5. 캐시 테이블에서 ComboBox 값 로드
6. 사용자는 드롭다운에서 값을 선택하고 버튼을 클릭하여 필터링된 하위 집합을 만듭니다.
// This is simplified version:
Clear Log();
// Step 1-2: Load and join two tables
LoadAndJoinData = Function({},
dt_results = Data Table("Table1");
dt_tracker = Data Table("Table2");
// Join tables by matching key
dt_joined = dt_results << Join(
With(dt_tracker),
By Matching Columns(:key1 = :key2),
Drop multiples(0, 0),
Output Table("Joined_Data")
);
Return(dt_joined);
);
// Step 3: Create cache table with unique values - THIS IS SLOW
CreateFilterCache = Function({dt_source},
Print("Creating filter cache table...");
// Create cache table to store unique values
dt_cache = New Table("Filter_Cache",
New Column("Filter_Name", Character),
New Column("Filter_Value", Character)
);
column_list = {"Column1", "Column2", "Column3", "Column4", "Column5"};
current_row = 0;
For(i = 1, i <= N Items(column_list), i++,
col_name = column_list[i];
Print(" Processing: " || col_name);
// Extract unique values
col = Column(dt_source, col_name);
col_values = col << Get Values;
aa = Associative Array();
For(j = 1, j <= N Items(col_values), j++,
val = col_values[j];
If(!Is Missing(val) & val != "",
aa[val] = 1;
);
);
unique_list = aa << Get Keys;
unique_list = Sort Ascending(unique_list);
// Store in cache table
For(k = 1, k <= N Items(unique_list), k++,
current_row++;
dt_cache << Add Rows(1);
dt_cache:Filter_Name[current_row] = col_name;
dt_cache:Filter_Value[current_row] = unique_list[k];
);
);
Print("Cache table created with " || Char(N Rows(dt_cache)) || " entries");
Return(dt_cache);
);
// Step 5: Load unique values from cache table
GetValuesFromCache = Function({dt_cache, column_name},
value_list = {};
For(i = 1, i <= N Rows(dt_cache), i++,
If(dt_cache:Filter_Name[i] == column_name,
Insert Into(value_list, dt_cache:Filter_Value[i]);
);
);
Insert Into(value_list, "", 1);
Return(value_list);
);
// Step 4-5: Create filter window and load from cache
CreateFilterWindow = Function({dt_final, dt_cache},
Print("Loading dropdowns from cache...");
// Load from cache - STILL SLOW for large lists
unique_col1 = GetValuesFromCache(dt_cache, "Column1");
unique_col2 = GetValuesFromCache(dt_cache, "Column2");
unique_col3 = GetValuesFromCache(dt_cache, "Column3");
unique_col4 = GetValuesFromCache(dt_cache, "Column4");
unique_col5 = GetValuesFromCache(dt_cache, "Column5");
Print("Creating window...");
win = New Window("Custom Filter",
V List Box(
Panel Box("Select Filters",
V List Box(
H List Box(
Text Box("Filter 1:"),
cb_1 = Combo Box(unique_col1, "", <
<SET width="">
0, dt_subset = dt << Subset( Output Table Name("Filtered_" || Format(Today(), "yyyy-mm-dd")), Rows(rowList) ); Print("Subset created: " || Char(N Rows(dt_subset)) || " rows"); ); ) ) ); ); // Main execution dt_joined = LoadAndJoinData(); dt_cache = CreateFilterCache(dt_joined); // Create cache once CreateFilterWindow(dt_joined, dt_cache); // Use cached values
</SET>
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.요약 표를 사용하면 고유한 값을 얻는 좋은 방법입니다.
Names Default To Here(1);
col_of_interest = "age";
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:age),
Freq("None"),
Weight("None"),
output table name("uniques"),
private
);
unique_ages = dt_summary[0, 1];
Close(dt_summary, no save);
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.제안해 주셔서 감사합니다. 성능은 확실히 약간 향상되었지만, 각 드롭다운마다 고유 데이터가 너무 많아서 드롭다운이 여전히 느립니다. 사용자 지정 드롭다운에 대한 좋은 해결책을 찾지 못할 경우, 데이터 필터를 사용하고 거기에 버튼을 추가하는 방법을 찾아야 할 것 같습니다.
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.데이터 필터를 적용한 Tabulate는 어떨까요?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
Tabulate(
Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :sex ) ), Row Table( Grouping Columns( :name ) ) ),
Local Data Filter( Mode( Show( 0 ) ), Add Filter( columns( :sex ), Where( :sex == "F" ) ) )
);
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.데이터 필터를 어느 정도 조작할 수는 있지만, 곧 한계에 부딪히게 될 것입니다. 속도 문제가 콤보 상자(표시) 내부에서 발생하는 것이 아니라면, 최적화할 수 있는 부분이 많습니다. 속도 테스트에 사용할 수 있는 예제 테이블(들)을 생성하는 스크립트를 제공해 주시면 이러한 최적화 방안을 훨씬 쉽게 설명할 수 있을 것입니다.
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.이 테이블에도 수천 개의 행이 있으므로 이 스크립트가 도움이 될 수도 있습니다.
이 부분을 제거하면 콤보 상자의 문제를 확인할 수 있습니다.
// Truncate for testing purposes (Truncated it 50 rows this needs to be removed)
unique_flights = unique_flights[1 :: 50];
Show( N Items( unique_flights ) );
// ========================================
// TEST SCRIPT - Single Column Filter (Table Air Traffic)
// Column - Flight ID
// ========================================
Clear Log();
// Todo: The associative array is not an appropriate method for large datasets with many unique values.
// Perhaps use the summary table or something else. Or find unique column values using hashing and storing in a temp table.
// Open the Air Traffic sample data table
dt = Open( "$SAMPLE_DATA/Air Traffic.jmp" );
// Safety check
If( Is Empty( dt ),
Throw( "No data table is open. Please open a data table first." );
);
Print( "Current Data Table: " || (dt << Get Name) );
Print( "Rows: " || Char( N Rows( dt ) ) );
Print( "Columns: " || Char( N Cols( dt ) ) || "\n" );
// METHOD 1: Use Summary table (most efficient for large datasets)
dt_summary = dt << Summary(
Group( :Flight ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Temp Summary" ),
private
);
unique_flights = dt_summary:Flight ID << Get Values;
Close( dt_summary, No Save );
// Truncate for testing purposes (Truncated it 50 rows this needs to be removed)
unique_flights = unique_flights[1 :: 50];
Show( N Items( unique_flights ) );
// // Sort unique values for faster lookup
// unique_flights = Sort List( unique_flights );
// Store reference to data table
::testDataTable = dt;
// Create filter window
::testFilterWindow = New Window( "Test Filter",
V List Box(
Text Box( "Select Flight ID:" ),
cb_flight = Combo Box( unique_flights, "" ),
H List Box(
Button Box( "Create Filtered Table",
sel_flight = cb_flight << Get Selected;
Print( "\n" || Repeat( "=", 60 ) );
Print( "Button clicked!" );
Print( "Selected Flight ID: " || Char( sel_flight ) );
// Use Where to filter (faster than For Each Row)
If( sel_flight != "",
rowList = ::testDataTable << Get Rows Where( :Flight ID == sel_flight );
Print( "Total rows matching filter: " || Char( N Items( rowList ) ) );
If( N Items( rowList ) > 0,
dt_subset = ::testDataTable << Subset(
Output Table Name( "Test Filtered - " || Format( Today(), "yyyy-mm-dd h:m:s" ) ),
Rows( rowList )
);
Print( "\nSUCCESS: Filtered table created!" );
Print( "Table: " || (dt_subset << Get Name) );
Print( "Rows: " || Char( N Rows( dt_subset ) ) );
Print( Repeat( "=", 60 ) || "\n" );
dt_subset << Bring Window To Front;
Close( ::testFilterWindow );
,
Print( "ERROR: No rows match the selected filter" );
Print( Repeat( "=", 60 ) || "\n" );
);
);
),
Button Box( "Cancel",
Close( ::testFilterWindow );
)
)
)
);
저도 비슷한 문제를 겪었는데, 불행히도 데이터 필터로 전환해야 했습니다.
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.콤보 상자가 제대로 작동하더라도 사용자가 2만 개의 항목을 스크롤해야 하는 것은 상당히 불편할 것 같습니다. 예를 들어, 추가 검색 기능을 갖춘 목록 상자를 사용하면 사용자 경험이 향상될 수 있습니다. JSL을 사용하여 텍스트 편집 상자와 목록 상자를 함께 사용하거나, 데이터 필터 또는 필터 색상 선택기를 사용할 수도 있습니다.
Re: 데이터를 드롭다운으로 표시하는 가장 좋은 방법은? 데이터 필터가 아닙니다.이 스크립트를 공유해 주셔서 감사합니다. 정말 이 스크립트는 제가 겪고 있는 문제를 정확하게 묘사하고 있습니다.