제 직업 생활을 고려할 때, 저는 JMP에 상대적으로 신참입니다. 사실 JMP와 JSL (JMP 스크립팅 언어) 경험은 약 4 년 전 JMP Life Sciences 그룹에서 개발자가 된 날부터 시작되었습니다. 반대로, 저는 20 년 이상의 경험을 쌓은 학부생 이었기 때문에 SAS를 사용해 왔습니다. 두 언어간에 많은 차이점이 있지만 내가 가장 좋아하는 일 중 하나는이 크고 풍부한 도구 세트를 사용하여 멋진 새 기능을 개발하는 것입니다. JMP 임상 .
나는 둘 다에 접근 할 수 있지만 JMP 과 SAS , 때로는 JSL을 사용하여 SAS에서 기능을 복제하는 방법을 궁금해합니다. 이 블로그 게시물의 주제는 SAS 데이터 단계 동작을 복제하여 그룹별로 첫 번째 및 마지막 레코드를 선택하는 방법입니다. SAS에서는 먼저 데이터를 정렬하고 데이터 단계에서 특수 키워드를 사용하여 수행합니다. 예를 들어 SAS에서 포맷 된 Big Class 데이터 테이블을 갖고 알파벳순으로 첫 번째 소년과 소녀를 선택하려는 경우 아래 프로그램에서이를 수행합니다.
proc sort data = bigclass;
성별로;
운영;
데이터를 먼저;
bigclass를 설정하십시오;
성별로;
if first.sex;
운영;
마지막 소년과 소녀를 알파벳 순으로 선택하려면 만약에 last.sex; . 그룹별로 추가로 첫 번째와 마지막을 선택하려면 비슷한 논리가 적용됩니다. 말하자면, 성별로 각 이름에 대해 가장 짧은 사람을 선택하고 싶었습니다. 다음과 같이하면됩니다.
proc sort data = bigclass;
성별 이름으로;
운영;
데이터를 먼저;
bigclass를 설정하십시오;
성별 이름으로;
if first.name;
운영;
내 동료 브래디 브래디 Col Min () 및 Col Max ()를 사용하여 JSL에서이 문제를 해결할 수 있도록 도와 주셨습니다. 그림 1에는 샘플 데이터 세트가 들어 있습니다. 원래 데이터에는 문자 (A에서 J까지)와 문자 2 (A에서 D까지) 만 포함되었습니다. 데이터 테이블은이 두 변수로 정렬됩니다. First.Letter는 Letter의 각 문자의 첫 번째 인스턴스에 대해 1과 같습니다 (그렇지 않은 경우 0). Last.Letter는 Letter의 각 문자의 마지막 인스턴스에 대해 1입니다 (그렇지 않은 경우 0). 이 변수의 수식은 다음과 같습니다.
First.Letter = If (Row () == Col Minimum (행 (), : Letter),
1,
0
)
Last.Letter = If (Row () == Col 최대 (Row (), : Letter),
1,
0
)
이 수식을 해석하기 위해 Col M ** imum () 함수는 다음을 사용합니다. 그룹 별 편지 및 각 문자 값 내에서 최소 또는 최대 행 번호 가져 오기. If () 함수는 현재 행 번호가 다음과 같으면 First.Letter = 1로 설정합니다. 문자 별 최소 행 번호. Letter에 대한 특정 값이 단 하나의 행을 가진다면, 그 레코드는 첫 번째 레코드와 마지막 레코드로 간주 될 것입니다. 첫 편지 = 1 및 마지막. 레터 = 1

그림 1. 데이터 테이블 FirstLast
위의 SAS 코드와 마찬가지로 여러 변수에 대해 확장 할 수 있습니다. Letter2의 각 문자의 첫 번째 인스턴스를 선택한다고 가정 해 보겠습니다. 이내에 Letter, 나는 단순히 함수에 byvar를 추가한다.
First.Letter2 = If (Row () == Col 최소값 (Row (), : Letter, : Letter2),
1,
0
)
Last.Letter2 = If (Row () == Col 최대 (Row (), : Letter, : Letter2),
1,
0
)
이 함수는 중복이 발생한 그룹별로 쉽게 하위 집합을 지정할 수 있다는 점에서 유용한 기능을 가지고 있습니다. 행 선택 위치 첫 편지 = 0 또는 마지막 편지 = 0은 다음과 같은 모든 행을 선택할 것입니다. 레터가 반복됩니다. Big Class의 컨텍스트에서 다음 함수를 사용합니다. 높이를 사용하면 특정 높이를 반복 할 수있는 하위 테이블을 만들 수 있습니다.
SAS에서 특별한 first.XX last.XX 변수를 만들려면 정렬이 필요합니다. 위의 데이터 테이블이 정렬되었지만 위의 JSL 코드가 작동하는 데 필요한 것은 아닙니다.
Brady Brady에게 많은 도움을 주신 덕분입니다.