cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
Choose Language Hide Translation Bar
View Original Published Thread

Excel의 Index(Match())와 동일함

JasonWS
Level I

각 고유 ID에 대한 첫 번째 측정과 모든 후속 측정 사이의 % 오차를 계산하고 싶은 데이터가 있습니다. 다른 행-열의 값을 기반으로 한 셀에서 데이터를 가져오는 방법을 알아낼 수 없었습니다. JSL이 필요한가요? 아니면 Excel에서 한 것처럼 수식을 만들면 됩니까?

강조 표시한 2개 열을 수식을 사용하여 계산하고 싶지만, 실제 집합에 수천 개의 데이터 행이 있으면 스크립트여야 하고 스크립트를 다시 실행할 때까지 값이 고정되어야 하는지 이해할 수 있습니다.

undefined

도움을 주시면 감사하겠습니다.

저는 JMP 16을 사용하고 있습니다.

원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.

1 ACCEPTED SOLUTION

Accepted Solutions
jthi
Super User

Re: Excel의 Index(Match())와 동일함

Col Min(Row(), :ID)를 사용하면 가장 빠른 측정값을 얻을 수 있습니다.

:Measurement[Col Min(Row(), :ID)]

그런 다음 이를 별도의 열에 사용하거나 결과를 계산하는 단일 공식의 일부로 사용할 수 있습니다.

7 REPLIES 7
jthi
Super User

Re: Excel의 Index(Match())와 동일함

Col Min(Row(), :ID)를 사용하면 가장 빠른 측정값을 얻을 수 있습니다.

:Measurement[Col Min(Row(), :ID)]

그런 다음 이를 별도의 열에 사용하거나 결과를 계산하는 단일 공식의 일부로 사용할 수 있습니다.

원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.

JasonWS
Level I

Re: Excel의 Index(Match())와 동일함

고맙습니다. 효과가 있군요.

다만 걱정되는 게 하나 있습니다. 각 ID에 두 번째 값을 사용하고 싶다면 어떻게 해야 할까요?

따라서 ID == A인 경우 "가장 빠른 측정" 열에 10.00001이 들어갑니다.

원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.

jthi
Super User

Re: Excel의 Index(Match())와 동일함

꽤 많은 다른 옵션이 있지만 이해하기 어려울 수 있습니다. "가장 간단한" 아이디어는 Col 통계 함수를 if 문과 결합하고 if 문은 누락된 값이나 찾고 있는 값을 반환합니다.

Col Min(If(Col Cumulative Sum(1, :ID) == 2, :Measurement, .), :ID)

undefined

Col 통계 함수를 사용하는 이점은 열 그룹화하고 수식으로 사용하는 데 적합하다는 것입니다.

원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.

jthi
Super User

Re: Excel의 Index(Match())와 동일함

내가 가장 "JMP와 비슷한" 방법으로 생각하는 방법은 대화형 솔루션이며 JMP가 자동화된 프로세스를 생성하도록 하고(향상된 로그/워크플로우 빌더 사용) JMP가 생성한 스크립트에서 남은 "문제"를 수정하는 것입니다.

이미 주문 열이 있으므로 사용할 수 있다고 가정하고 주문 == 2의 하위 집합을 만듭니다. 마우스 오른쪽 클릭 -> 일치하는 셀 선택 -> 하위 집합 만들기

undefined

undefined

하위 집합에서 측정 열의 이름을 다른 것으로 바꿉니다. 그런 다음 원래 테이블로 돌아가서 업데이트를 사용하여 ID를 일치 조건 열로 사용하여 하위 집합을 테이블에 다시 조인합니다.

undefined

이제 열에서 두 번째 주문의 측정값을 얻었습니다. 그리고 JMP는 다음과 같은 스크립트를 작성합니다.

// Select matching cells
Data Table("JMP Example") << Select Where(:Order == 2);


// Subset data table
// → Data Table("Subset of JMP Example")
Data Table("JMP Example") << Select Where(:Order == 2) <<
Subset(Copy formula(0), Selected Rows(1), Selected columns only(0));


// Change column name: Measurement → Measurement_ORDER2
Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement_ORDER2");


// Update data table
Data Table("JMP Example") << Update(
	With(Data Table("Subset of JMP Example")),
	Match Columns(:ID = :ID),
	Add Columns from Update Table(:Measurement_ORDER2),
	Replace Columns in Main Table(None)
);

확실히 최고의 스크립트는 아니지만 작동하며 무슨 일이 일어나고 있는지 아이디어를 제공합니다. 이 프로세스를 시작하기 전에 워크플로 기록을 시작하고 이를 자동화하기 위한 워크플로를 만들 수도 있습니다(저는 개인적으로 워크플로를 사용하지 않고 향상된 로그를 선호하지만, 특히 무언가를 자동화하려는 경우 매우 유용할 수 있습니다). 워크플로 빌더로 만든 스크립트는 다음과 같습니다.


Names Default To Here(1);


Workflow 6=function({}, 
    step_name = "Open Data Table: JMP Example.jmp";
    //Open Data Table: JMP Example.jmp
    Open("$DOWNLOADS/JMP Example.jmp");

    step_name = "Select matching cells";
    //Select matching cells
    Data Table("JMP Example") << Select Where(:Order == 2);

    step_name = "Subset data table";
    //Subset data table
    Data Table("JMP Example") << Select Where(:Order == 2) <<
    Subset(Selected Rows(1), Selected columns only(0));

    step_name = "Change column name: Measurement → Measurement2";
    //Change column name: Measurement → Measurement2
    Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement2");

    step_name = "Update data table";
    //Update data table
    Data Table("JMP Example") << Update(
    	With(Data Table("Subset of JMP Example")),
    	Match Columns(:ID = :ID),
    	Add Columns from Update Table(:Measurement2),
    	Replace Columns in Main Table(None)
    );

    step_name = "Close Data Table: Subset of JMP Example";
    //Close Data Table: Subset of JMP Example
    Close(Data Table("Subset of JMP Example"), NoSave);
);
Workflow 6();

일반적으로 워크플로우 빌더가 만든 스크립트는 향상된 로그가 만든 스크립트와 유사한 문제가 있지만 워크플로우에는 추가적인 이점이 있습니다(그렇게 생각하고 싶다면 참조 업데이트와 같은 매우 간단한 것 외에는 대부분 성가신 일이라고 생각합니다). 그리고 JMP에서 만든 스크립트를 수정하는 방법은 다음과 같습니다.

Names Default To Here(1);

dt = Open("$DOWNLOADS/JMP Example.jmp");
dt << Clear Column Selection << Clear Select;

rows_of_interest = dt << Get Rows Where(:Order == 2);
dt_subset = dt << Subset(Rows(rows_of_interest), 
	Copy formula(0), 
	Selected columns only(0),
	Invisible
);

Column(dt_subset, "Measurement") << Set Name("Measurement_ORDER2");

dt << Update(
	With(dt_subset),
	Match Columns(:ID = :ID),
	Add Columns from Update Table(:Measurement_ORDER2),
	Replace Columns in Main Table(None)
);

Close(dt_subset, no save);

"더 고급" JSL을 사용하여 수행할 수도 있지만 일반적으로 수식을 사용하고 JSL을 피하고 싶다면 사용하지 않을 것입니다. 이를 활용할 수 있는 유일한 경우는 속도가 필요한 경우이며, 이 경우에도 최적화하지 않으면 더 느려질 수 있습니다. 다음은 JSL을 사용하는 한 가지 옵션이며 설명에 대한 몇 가지 주석이 있습니다.

더 보기...
Names Default To Here(1);

dt = Open("$DOWNLOADS/JMP Example.jmp");

// Get all IDs into a list using data table subscripting
ids = dt[0, "ID"];

// Get all unique IDs using Summarize (there are many other methods)
// Note that Summarize will change numeric values to strings (doesn't matter in this case)
Summarize(dt, uniq_ids = By(:ID));

// We can loop over the unique IDs while collecting results
// I will store results to Associative Array as it is efficient method and easy to access
aa_idpos = Associative Array();
aa_meas = Associative Array();
idx_of_interest = 2;
For Each({cur_id}, uniq_ids,
	// We can use Loc to find specific ID from a list of IDs
	cur_idx = Loc(ids, cur_id);
	
	// From this we can pick second index for example and store it to our aa
	// Note: Usually you want to check that there is at least two items if you do this
	aa_idpos[cur_id] = cur_idx[2];
	
	// You could also get the Measurement value instead
	// (I prefer index as then I can access value from any of the columns easily)
	aa_meas[cur_id] = :Measurement[cur_idx[idx_of_interest]];
);
// Show(aa_idpos);

// Then you can basically do whatever you want with these
// Fill them into the table for example by using Formula OR For Each Row
// Formula tends to be faster if you just need one column
new_col = dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
	aa_meas[:ID]
));
// aa_meas WON'T be evaluated unless you specifically do it, so either remove the formula
// or evaluate it using eval(evalexpr()) / eval(substitute())
dt << run formulas;
new_col << Delete Formula();
/*
// or evaluation (one option, there many other options (local variables, not worrying about the scope, ...))
new_col = Eval(EvalExpr(
	dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
		aa = As Constant(Expr(aa_meas));
		aa[:ID]
	));	
));*/

원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.

txnelson
Super User

Re: Excel의 Index(Match())와 동일함

샘플 데이터 테이블에 있는 것처럼 데이터가 정렬되어 있고 항상 두 번째 값이 있다고 가정하는 경우

:Measurement[Col Min( Row(), :ID ) + 1]

는 시리즈의 두 번째 행을 사용하는 매우 간단한 방법입니다.

원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.

shampton82
Level VII

Re: Excel의 Index(Match())와 동일함

@txnelson 이 제안한 것과 같은 방식으로 이것도 사용할 수 있습니다.

undefined

:Measurement[Col Maximum( If( :Order == 2, Row() ), :ID )]

이는 각 ID에 대한 두 번째 측정값을 반환합니다.


@JasonWS

저는 이 PowerPoint를 작성하여 새로운 JMP 사용자를 위해 Excel에서 vlookup과 같은 작업을 수행하는 방법을 설명했습니다. 도움이 되기를 바랍니다.


스티브


도움이 되길 바랍니다!


원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.

hogi
Level XII

Re: Excel의 Index(Match())와 동일함

참조에 대한 여러 항목을 집계하려는 경우나 제외된 행이 있는 경우 주제가 더 복잡해집니다.
게다가 일상 업무 중에 이런 계산을 자주 적용한다면, 수식을 계속해서 / 수동으로 만들고 싶지 않을 것입니다.
위시리스트에 위시사항이 있습니다. 새로운 수식 열/분포: "정규화" .
하지만 다른 사용자의 관심은 매우 낮습니다. 단지 2개의 쿠도스만 받았습니다...

그래서 저는 @mia_stephens 의 조언을 따랐습니다.
undefined
... 그리고 나만의 AddIn을 개발했습니다. Marketplace에서 찾을 수 있습니다:
https://marketplace.jmp.com/appdetails/Normalization+GUI


해당 추가 기능은 이러한 계산을 자동으로 생성하는 사용자 인터페이스를 제공합니다.
다른 여러 옵션 외에도 "첫 번째", "마지막" 및 "N-1" 옵션이 있습니다.

undefined


두 번째 항목을 정규화에 사용하는 것도 가능합니다.
그냥 활성화 시키세요

undefined

@shampton82 가 설명한 것처럼 순위/순서 열을 사용합니다.

undefined


결국 공식은 다음과 같습니다.

undefined


@shampton82 의 접근 방식과 매우 유사합니다.
Col ... 집계를 사용하여 참조 값을 다른 행에 분산합니다.

미묘한 차이점: 행 인덱스가 아닌 값을 분배한다는 점입니다.

원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.