특정 조건을 만족하는 열 내 고유 항목의 개수를 계산합니다."대규모 수업"에서 현재 행에 있는 사람의 키와 같거나 그보다 작은 이름의 고유 개수를 세는 수식을 만들고 싶다고 가정해 보겠습니다. 어떻게 하면 될까요?
저는 이것을 가지고 있습니다:
이 높이 = :높이;
Col N Unique( :name, :height <= thisHeight );
두 번째 매개변수가 그룹화 매개변수라는 것을 알고 있고, 첫 번째 매개변수에 전달되는 값을 제한하는 것이 더 직관적이라는 것도 알고 있지만, 지금까지 시도해 본 모든 방법으로는 원하는 결과를 얻지 못했습니다.
데이터 접근제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산가장 유사한 내장 함수는 Col Rank( :height, < ) 입니다. 문제는 이것이 thisHeight 이하의 행 의 총 개수를 세는 것이지, 고유한 이름 의 개수를 세는 것이 아니라는 점입니다.
대신 다음과 같은 사용자 지정 수식을 사용해 볼 수 있습니다.
thisHeight = :height; //store the current height value
// Build an associative array to collect unique names at or below thisHeight
aa = Associative Array();
For( i = 1, i <= N Rows(), i++,
If( Column("height")[i] <= thisHeight,
aa[Column("name")[i]] = 1 // This only adds to the Associative Array if this is a new, unique name
)
);
// The number of Items that have been added to the array = number of unique names
N Items( aa )
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산새로운 Col 함수는 이전 함수와 동작 방식이 약간 달라서, 그걸로는 가능할지 잘 모르겠습니다.
As Constant(n = :name << get values);
curheight = :height;
r = Where(:height <= curheight);
N Items(Set Unique(n[r]));
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산어제 저녁에 이와 매우 유사한 코드를 시도해 봤는데 JMP가 멈춰버렸습니다. 밤새도록 실행시켜 놓고 오늘 아침에 확인해 보니 JMP 데이터 테이블 창이 비어 있고 응답이 없었으며, 작업 관리자를 보니 컴퓨터는 코어 하나만 사용하고 있었고 40GB 이상의 RAM이 여유 공간으로 남아 있었습니다(즉, RAM 부족이나 CPU 점유 문제는 아니었습니다). 제 테이블에는 거의 40만 개의 행이 있으므로 이 방법은 아마도 O(N^2) 정도의 시간 복잡도를 가질 것 같습니다.
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산@jthi 위 댓글에 대한 답변으로, 이것도 O(N^2) 솔루션처럼 보입니다. (잘못된 수식 때문에 세션 전체가 멈추거나 충돌하는 건 정말 짜증나는 일이죠. 어제 비슷한 해결책을 시도하다가 오후 작업량의 상당 부분을 날려버렸습니다.)
새로운 Col 함수들이 이전과 같은 방식으로 작동하지 않아서 아쉽네요. 제 질문이 너무 단순했던 것 같습니다. 그룹화 열도 필요한데, 이 솔루션에서 어떻게 구현해야 할지 모르겠습니다. 아마 파이썬으로 직접 구현해야 할 것 같은데, 그러면 열이 자동으로 업데이트되지 않고 파이썬 스크립트를 테이블에 저장할 수도 없어서 안타깝습니다.
추신: 저는 모든 소통에서 당신에게서 조금씩이라도 배우고 싶습니다
-- 이 접근 방식에서 "As Constant()" 함수가 필요한 이유는 무엇인가요? 이 함수가 없으면 어떻게 될까요?
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산만약 수식이 필요하다면, 파이썬이 얼마나 잘 작동할지는 잘 모르겠습니다. Constant() 함수는 각 행에서 이름 목록을 반복해서 가져오는 것을 방지하기 위해 존재합니다.
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산파이썬 솔루션은 제대로 작동했고, 여러 가지를 고려해 볼 때 구현/실행 속도도 상당히 빨랐습니다.
Col N Unique() 함수가 향후 버전에서 다른 함수들처럼 개선되기를 여전히 바라고 있습니다.
JSP 공식 모음집 같은 게 어딘가에 있으면 좋겠다는 생각도 듭니다. 33년 동안 VBA, AppleScript, Perl, Python, JavaScript (그리고 C++도 조금)를 사용해 코딩을 해왔는데, JSL은 그중에서 가장 배우고 이해하기 어려운 언어입니다. As Constant()가 왜 필요한지, 도대체 무슨 역할을 하는지 아직도 잘 모르겠습니다. 스크립팅 가이드 책을 거의 다 읽었지만, 뭔가 보충 설명이 필요할 것 같습니다.
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산수식 실행의 각 행에서 변경되지 않는 값을 평가할 필요는 없습니다. As Constant() 함수는 바로 그러한 역할을 하며, JMP가 해당 수식을 첫 번째 행에서 한 번만 평가하도록 합니다.
상수(expr)로

제 생각에는 (완전히 똑같지는 않겠지만, 상당히 비슷하게) 대체할 수 있을 것 같습니다.
If(Row() == 1,
n = :name << get values;
);
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산이 질문이 점점 더 깊은 수렁으로 빠질 위험을 무릅쓰고, 한 가지만 더 질문드리겠습니다.
열 수식은 실질적으로 한 번만 평가되지만, 각 표현식은 배열 컨텍스트에서 평가되는 것인가요?
아니면 Row() 함수가 현재 평가 중인 행을 지정하면서 전체 수식이 각 행마다 다시 실행되는 것인가요?
아니면 제가 뭔가 더 근본적인 것을 오해하고 있는 걸까요? JMP가 수식을 처리하는 방식에 대한 제 머릿속 모델은 서로 양립할 수 없는 두 부분으로 나뉘어 있는 것 같습니다...
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산JMP 내부 구조를 잘 아는 분이라면 제 추측보다 더 나은 답변을 주실 수 있을 것 같습니다 ( @Craige_Hales 님). 저는 이것들을 각 행에 대해 필요할 때마다 직접 데이터테이블에 평가되는 표현식(단순히 JSL)으로 생각합니다. '필요할 때'는 제가 평가를 억제하지 않는 한 JMP가 결정합니다. Col 함수와 같은 일부 최적화 기능은 (대부분의 경우) 한 번만 평가됩니다.
JMP 도움말에서 유용한 링크들을 찾을 수 있지만, 제가 빠르게 찾을 수 있는 링크는 이것뿐입니다.
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산토끼굴을 탐험하는 한 가지 기법을 소개합니다.
New Table( "Untitled",
Add Rows( 3 ),
New Column( "a",
Formula(Write( "\!nA" || Char( Row() ) );Row();),
Set Selected
),
New Column( "b",
Formula(Write( "\!nB" || Char( Row() ) );:c + :d + 100;)
),
New Column( "c",
Formula(Write( "\!nC" || Char( Row() ) );:a + 1000;)
),
New Column( "d",
Formula(Write( "\!nD" || Char( Row() ) );:a + 10000;)
),
new column( "e",
formula(write("\!nE" || char(row())); asconstant(write("\!nE as constant "|| char(row())); Q=a+b+c+d); Q;)
)
);
/*
A1 << A must be done first, every other column depends on A
A2
A3
D1
D2
D3
C1
C2
C3
B1 << B must be after C and D
B2
B3
E as constant 1 << the constant is calculated before the first cell, but using row 1
E1 << E must be last; the asconstant value uses all other columns
E2
E3
*/

세미콜론(;)은 일련의 명령문을 실행하고 마지막 명령문의 값을 반환하는 JSL 연산자입니다. 즉, print/show/write 문을 계산문 앞에 추가하여 로그에 실행 과정을 기록할 수 있습니다.
위에서 asconstant(...) 함수가 첫 번째 행을 계산하기 전에 추출되지만, 1번째 행이 현재 행으로 간주된다는 것을 알게 되었습니다.
JMP는 또한 열을 정렬하여 어떤 열이 먼저 평가될 수 있는지 파악합니다.
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산E열은 다음과 같이 작성하는 것이 더 이해하기 쉽습니다.
New Column( "e",
formula(
Write( "\!nE" || Char( Row() ) );
As Constant( Write( "\!nE as constant " || Char( Row() ) ); a + b + c + d; );
)
)
Q 변수는 불필요하며 AsColumn의 존재 이유를 숨깁니다.
제목: 특정 조건을 만족하는 열 내 고유 항목 수 계산다음은 도움이 될 수 있는 링크입니다(모든 것을 하나의 수식에 억지로 넣으려 하지 마세요). JMP 사용법 > JMP에서 수식 만들기 > JMP에서 수식 만들기

추가적인 이점은 여러 개의 수식이 있는 경우 결과를 검증하고 경우에 따라 수식을 디버깅하는 것이 훨씬 쉽다는 것입니다.