항목 1
항목 1의 어려운 부분 도전 10 코드가 아니라 quantile의 정의에 대한 복잡성입니다. 먼저, 사물 분포를 독립적으로 유지하고 값이 아닌 값의 순위 순서로 작업하겠습니다. 즉, 값을 오름차순으로 정렬하고 해당 순서에서 나타나는 위치에 따라 번호를 매깁니다. 넥타이로 무엇을 할지 결정해야 합니다. 계속해서 순차적으로 순위를 매기거나 동일한 값을 부여할 수 있습니다. 전자의 단점은 하나 이상의 그룹에 동일한 값이 나타날 수 있다는 것입니다. 후자의 접근 방식의 단점은 그룹당 항목 수가 덜 균형적일 수 있다는 것입니다. 이 두 가지 접근 방식은 순위 그리고 랭킹 타이 JSL 함수. 우리는 두 번째 접근 방식에서 동점을 부여할 값에 대해 이야기하지 않았습니다. 우리는 그들 모두에게 다음 순차 순위 순서 값을 줄 수 있습니다. 또는 순차적으로 순위가 매겨진 값의 평균을 낼 수 있습니다. 두 경우 모두 동점이 없는 경우 받았을 순위를 다음 순차 비동점 값에 부여하고 싶을 것입니다. 랭킹 타이 순위의 평균을 구하고 단순화를 위해 이것을 사용합니다.
다음 질문은 그룹을 나누는 방법입니다. 우리는 그것들을 가능한 한 똑같이 나누려고 노력할 수 있습니다. 이를 수행하는 간단한 방법은 동률을 순차적으로 배치하는 것입니다. 바닥 ( N / g ) 각 그룹의 항목(여기서 N 그것은 항목의 총 수와 g 분위수 그룹의 수입니다). 우리는 어디에 넣을지 결정해야 할 것입니다. N – g * 바닥 ( N / g ) < g 추가 값. 아래 코드는 이 모든 것을 간단하고 깔끔하게 처리합니다.
Ceiling(Ranking(inVec)/(N Row(inVec)/quant))
어디 인벡 입력(열) 벡터이고 수량 Quantile 그룹의 수입니다.
위의 코드는 묶인 값이 그룹 간에 분할될 수 있습니다. 이를 방지하기 위해 교체할 수 있습니다. 순위 ~와 함께 랭킹 타이 . 전체 기능의 예는 다음과 같습니다.
quantileGroup = Function({inVec,quant=10,method=1},{outVec,sumTblRef,ranks},
inVec = Shape(inVec,N Row(invec)*N Col(inVec),1);
If(method ==1,
outVec = Ceiling(Ranking(inVec)/(N Row(inVec)/quant)),
outVec = Ceiling(Ranking Tie(inVec)/(N Row(inVec)/quant))
);
outVec;
);
항목 2
카운트가 적은 그룹을 집계할 수 있는 방법에는 여러 가지가 있습니다. 관측치의 절대 수, 관측치의 상대적 수(예: 가장 큰 그룹의 10% 미만 카운트가 있는 그룹), 총 그룹 수 고정 등 장점과 단점이 있습니다. 유연한 솔루션을 제공하기 위해 슬라이더를 사용하여 조정할 수 있는 막대 차트로 관리되는 대화형 및 시각적 접근 방식을 선택했습니다. 이렇게 하면 좋아 보이는 그룹 분포를 찾을 때까지 슬라이더를 앞뒤로 움직일 수 있습니다. 그룹 수가 많을 때 빠른 코드를 작성하는 데 어려움이 있었습니다. 간단하게 하기 위해 데이터 테이블 작업 및 플랫폼으로 작업하고 싶었습니다. 자동 재계산 켜짐). 다음은 이전과 이후의 모습에 대한 예입니다.
전에

후에

일반적으로 이 코드는 그룹에서 요약 테이블을 작성하고 그룹 수( N 행 열)로 주파수 변하기 쉬운. 이렇게 하면 상당히 클 수 있는 원본 테이블의 값을 업데이트할 필요가 없습니다. 코드는 다음에서 찾을 수 있습니다. 그룹 집계.JSL . 요약의 원래 그룹 값 목록은 개수(순위)의 벡터 순위 순서와 함께 전역 변수 그룹에 저장됩니다. 슬라이더를 움직이면 집계 낮은 수 요청 그룹 수( n그룹 )는 슬라이더의 위치에 따라 전달됩니다. 그룹 수는 순위 벡터에서 쉽게 선택할 수 있습니다. 예를 들어 총 10개의 그룹이 필요한 경우 순위가 10 이상인 원래 그룹의 값은 집계된 그룹 값(예: "기타")으로 설정되며 다른 모든 그룹은 동일하게 유지됩니다. 테이블이 정렬되어 있기 때문에 10행부터 값을 변경하기만 하면 됩니다.
항목 3 / 항목 4
이 항목에 대한 나의 동기는 항목 4의 전조였습니다. AA(Associative Array)에서 무언가를 찾는 것이 사용하는 것보다 훨씬 빠릅니다. 위치 . 209,405개의 단어로 AA 만들기 단어목록.JMP 내 컴퓨터에서 12초도 안 걸렸습니다. 아래 표는 다음 중 하나를 사용하여 표에서 임의의 단어 목록을 찾는 시간을 보여줍니다. 위치 또는 AA.
N 단어
|
위치(초)
|
연관 배열(초)
|
1
|
0.19
|
0.000045
|
5
|
0.91
|
0.000127
|
10
|
1.78
|
0.000244
|
25
|
4.51
|
0.000592
|
50
|
9.11
|
0.001019
|
70
|
12.47
|
0.001454
|
100
|
17.82
|
0.002155
|
70단어보다 긴 목록의 경우 AA를 구축하는 것이 좋습니다. 이 두 가지 접근 방식을 테스트하는 데 사용한 코드는 다음과 같습니다. 위치 대 AA.JSL .
AA를 검색 가능한 데이터 구조로 사용하면 장단점이 있습니다. 장점은 다른 AA를 포함하여 모든 값을 AA 키와 연결할 수 있다는 것입니다. 단점은 키가 고유해야 한다는 것입니다(내 옵션에는 큰 문제가 아님). 더 중요한 것은 검색 값이 키 목록에 없는 경우 검색 프로세스를 보강해야 한다는 것입니다. 즉, 가능한 모든 검색 값이 선험적으로 알려진 경우 구현이 상대적으로 쉽지만 그렇지 않은 경우 조금 더 까다롭습니다. 이것은 우리가 그것들을 사용할 수 없다는 것을 의미하지 않습니다; 우리는 조금 더 교활해야 합니다. 아래 코드와 같은 것이 작동합니다. 3번 항목에 태그된 게시물에 언급된 사례 . 조금 더 번거롭고 어떤 경우에는 더 느릴 수 있지만 매우 유연합니다. Associative Array의 내용을 수정하기만 하면 조회 사전이 변경되는 상황에 쉽게 적응할 수 있습니다.
aaMap = Associative Array(
{"1","2","3","4","5","6","7","8","9","0","M","K"},
{"1","2","3","4","5","6","7","8","9","0","e6","e3"}
);
findAndReplace = Function({inList,aaMap},
outNums = Transform Each({nextString},inList,Output("Matrix"),
nextChars = Items(nextString,"");
Num(Concat Items(Transform Each({nextChar},nextChars,aaMap[nextChar]),""));
);
outNums
);
Les Misérables의 영어 번역에 나오는 모든 단어의 사전을 구축하는 것과 같이 좀 더 일반적이고 더 큰 문제를 해결하고 싶다면 어떻게 해야 할까요? 단어가 표준 ASCII 문자 집합 외부의 문자(예: 분음 부호가 있는 문자)를 포함하여 알파벳 문자로만 구성되어 있다고 가정하여 시작하겠습니다. 다른 모든 것은 구분 기호입니다. 여기서 문제는 우리가 접할 수 있는 구분 문자가 무엇인지 확신할 수 없다는 것입니다. 어떤 문자가 단어를 구성하는지 알고 있으므로 목록에 없으면 구분 기호라고 가정할 수 있습니다.
패턴 일치에는 사전을 만드는 데 사용할 단어를 찾기 위한 완벽한 도구가 있습니다. 팻 스팬 그리고 팻 브레이크 .우리는 사용할 수 있습니다 단어 , 그러나 포함된 구분 기호가 있는지 각 항목을 확인해야 합니다. 패턴 일치를 사용하면 모든 작업을 한 번에 처리할 수 있습니다. 코드는 다음과 같습니다. 전체 프로세스는 8~9초가 소요되었습니다. 코드를 다른 텍스트에 적용하려면 추가 문자를 포함하고 파일을 다른 인코딩으로 저장하는 등 일부 미세 조정이 필요할 수 있습니다(확장 ASCII 문자를 캡처하기 위해 utf-16을 사용했습니다). 나는 빚을 지고 있다 @Craige_Hales 내가 그것을 작동시키기 위해 고군분투한 후에 이것을 도와준 것에 대해. Les Misérables의 텍스트 파일은 프로젝트 구텐베르크 . 당신은 그것을 찾을 수 있습니다 여기 .
bigText = Load Text File("Les Misérables.txt");
aaLookup = Associative Array();
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZé´É";
wordLoc = 0;
Pat Match(bigText,
Pat Repeat(
(
Pat Pos() >> nextLoc
+ Pat Span( letters ) >> nextWord
+ Pat Test(
Try(
Insert Into(aaLookup[Lowercase(nextWord)],nextLoc),
aaLookup<<INSERT></INSERT>
멋진! 그만큼 노력하다 () 연관 배열에 사용 중인 구문 에 집어 넣다() 기존 요소를 먼저 테스트하는 것보다 빠를 수 있습니다.
내가 독서 동아리에 들어갈 만큼 젊었을 때, 여행을 많이 다니는 친구 중 한 명이 단어가 포함된 구절을 읽게 되었습니다. 요세미티 , 나는 결코 만난 적이 없습니다. 나는 그의 4음절 발음에 깜짝 놀랐고 선생님이 유쾌하게 놀란 것을 보았던 것을 기억합니다.
몇 년 후, 누군가가 나에게 말할 수 있다고 말했습니다. 절름발이 롭 주의를 끌 수 있을 만큼 정확한 극의 이름을 알아내십시오.