- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Excel의 Index(Match())와 동일함
각 고유 ID에 대한 첫 번째 측정과 모든 후속 측정 사이의 % 오차를 계산하고 싶은 데이터가 있습니다. 다른 행-열의 값을 기반으로 한 셀에서 데이터를 가져오는 방법을 알아낼 수 없었습니다. JSL이 필요한가요? 아니면 Excel에서 한 것처럼 수식을 만들면 됩니까?
강조 표시한 2개 열을 수식을 사용하여 계산하고 싶지만, 실제 집합에 수천 개의 데이터 행이 있으면 스크립트여야 하고 스크립트를 다시 실행할 때까지 값이 고정되어야 하는지 이해할 수 있습니다.
도움을 주시면 감사하겠습니다.
저는 JMP 16을 사용하고 있습니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
Col Min(Row(), :ID)를 사용하면 가장 빠른 측정값을 얻을 수 있습니다.
:Measurement[Col Min(Row(), :ID)]
그런 다음 이를 별도의 열에 사용하거나 결과를 계산하는 단일 공식의 일부로 사용할 수 있습니다.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
Col Min(Row(), :ID)를 사용하면 가장 빠른 측정값을 얻을 수 있습니다.
:Measurement[Col Min(Row(), :ID)]
그런 다음 이를 별도의 열에 사용하거나 결과를 계산하는 단일 공식의 일부로 사용할 수 있습니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
고맙습니다. 효과가 있군요.
다만 걱정되는 게 하나 있습니다. 각 ID에 두 번째 값을 사용하고 싶다면 어떻게 해야 할까요?
따라서 ID == A인 경우 "가장 빠른 측정" 열에 10.00001이 들어갑니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
꽤 많은 다른 옵션이 있지만 이해하기 어려울 수 있습니다. "가장 간단한" 아이디어는 Col 통계 함수를 if 문과 결합하고 if 문은 누락된 값이나 찾고 있는 값을 반환합니다.
Col Min(If(Col Cumulative Sum(1, :ID) == 2, :Measurement, .), :ID)
Col 통계 함수를 사용하는 이점은 열 을 그룹화하고 수식으로 사용하는 데 적합하다는 것입니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
내가 가장 "JMP와 비슷한" 방법으로 생각하는 방법은 대화형 솔루션이며 JMP가 자동화된 프로세스를 생성하도록 하고(향상된 로그/워크플로우 빌더 사용) JMP가 생성한 스크립트에서 남은 "문제"를 수정하는 것입니다.
이미 주문 열이 있으므로 사용할 수 있다고 가정하고 주문 == 2의 하위 집합을 만듭니다. 마우스 오른쪽 클릭 -> 일치하는 셀 선택 -> 하위 집합 만들기
하위 집합에서 측정 열의 이름을 다른 것으로 바꿉니다. 그런 다음 원래 테이블로 돌아가서 업데이트를 사용하여 ID를 일치 조건 열로 사용하여 하위 집합을 테이블에 다시 조인합니다.
이제 열에서 두 번째 주문의 측정값을 얻었습니다. 그리고 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) 로 다시 번역됩니다.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
샘플 데이터 테이블에 있는 것처럼 데이터가 정렬되어 있고 항상 두 번째 값이 있다고 가정하는 경우
:Measurement[Col Min( Row(), :ID ) + 1]
는 시리즈의 두 번째 행을 사용하는 매우 간단한 방법입니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Excel의 Index(Match())와 동일함
참조에 대한 여러 항목을 집계하려는 경우나 제외된 행이 있는 경우 주제가 더 복잡해집니다.
게다가 일상 업무 중에 이런 계산을 자주 적용한다면, 수식을 계속해서 / 수동으로 만들고 싶지 않을 것입니다.
위시리스트에 위시사항이 있습니다. 새로운 수식 열/분포: "정규화" .
하지만 다른 사용자의 관심은 매우 낮습니다. 단지 2개의 쿠도스만 받았습니다...
그래서 저는 @mia_stephens 의 조언을 따랐습니다.
... 그리고 나만의 AddIn을 개발했습니다. Marketplace에서 찾을 수 있습니다:
https://marketplace.jmp.com/appdetails/Normalization+GUI
해당 추가 기능은 이러한 계산을 자동으로 생성하는 사용자 인터페이스를 제공합니다.
다른 여러 옵션 외에도 "첫 번째", "마지막" 및 "N-1" 옵션이 있습니다.
두 번째 항목을 정규화에 사용하는 것도 가능합니다.
그냥 활성화 시키세요
@shampton82 가 설명한 것처럼 순위/순서 열을 사용합니다.
결국 공식은 다음과 같습니다.
@shampton82 의 접근 방식과 매우 유사합니다.
Col ... 집계를 사용하여 참조 값을 다른 행에 분산합니다.
미묘한 차이점: 행 인덱스가 아닌 값을 분배한다는 점입니다.
원래 English (US) 로 작성된 이 게시물은 귀하의 편의를 위해 번역되었습니다. 답장을 보내면 English (US) 로 다시 번역됩니다.