배열을 문자열로 변환안녕하세요 여러분,
다른 테이블의 배열에서 값을 가져와 선택 항목의 값으로 사용하려고 합니다. 배열을 문자열로 변환하는 방법이 있습니까?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
데이터 테이블다른스크립팅Re: 배열을 문자열로 변환나는 이것이 당신이 원하는 것을 줄 것이라고 생각합니다
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Re: 배열을 문자열로 변환다시 질문의 핵심에 도달하는 Jim의 능력에 놀랐습니다. 여기에 있는 두 가지 멋진 코드는 더 긴 설명이 필요합니다.
이것은 무엇을합니까?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1 데이터 테이블 참조이며, "이름" 문자열로 된 열의 이름(문자 그대로 "NAME"이지만 변수에 있을 수 있음)이고 기둥 함수는 열 참조를 반환합니다. 그만큼 <<값 가져오기 message는 중복을 포함하여 열에서 모든 값을 가져옵니다. 그만큼 연관 배열 함수는 고유한 값 세트를 생성하고, <<키 가져오기 메시지는 고유한 값을 반환합니다. (잘했어. @jshvt17 .)
이?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
그만큼 <<어디서 선택 메시지는 각 행에서 작동합니다. 병합된 파일 , 한 번에 하나씩 인수가 0이 아닌 경우 행을 선택합니다.
그만큼 위치() 함수는 인덱스 행렬을 반환합니다. 에서 목록을 검색합니다. 이름_키 :Name_final의 경우. 결과 행렬에는 0개 이상의 행이 있을 수 있지만 이 예에서는 키가 고유하기 때문에 0개 또는 1개의 행을 갖습니다. 그만큼 행() 함수는 0 또는 1을 반환한 다음 >0과 비교하여 0 또는 1을 유지합니다. 따라서 :Name_final이 ref_file_1:NAME 목록에 있으면 행이 선택됩니다.
대안:
name_key에 1e6개 이상의 이름이 있고 merge_file에 1e7개 이상의 행이 있다면 어떻게 될까요? 어떤 공연이 펼쳐질까요? loc 함수는 검색을 많이 할 것입니다. 1e13 문자열을 비교합니다. 기다리다 지치실 겁니다. 이에 대한 수정은 다음과 같이 연관 배열을 사용하는 것입니다.
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
이제 nameSet에는 1e7 조회만 있습니다. 무료는 아니지만 1e6 항목을 순차적으로 확인하는 것보다 훨씬 빠릅니다. 약 20개 정도가 각각 비교될 것입니다(log2(1e6)). 이것은 또한 다음 관리자가 더 쉽게 따를 수 있습니다.
(테스트되지 않았습니다. 수정 환영!)
Re: 배열을 문자열로 변환크레이지,
다시 한 번 JMP에 대해 새로운 사실을 알게 되었습니다.나는 원래 Contains() 함수를 사용하여 코드를 작성했지만 Loc() 함수를 사용하여 변환했습니다.
Contains( "BARBARA ANN", "BARBARA")
True를 반환합니다.
나는 포함의 비교 구성 요소가 JMP 항목 목록인 경우
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
또한 True를 반환하지만 False를 반환합니다. 이는 절대 일치를 수행함을 의미합니다.
좋은 정보 감사합니다