한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법안녕하세요 여러분, 저는 데이터 테이블이 2개 있습니다. 제 데이터 세트 테이블 "Dataset.jmp"에는 "ENICITY"와 "ETHCAT"라는 코드로 된 열 데이터가 있었고, 이를 데이터 세트 "Dictionary.jmp"에 연결하여 코드를 레이블(사전 파일의 레이블 열)로 변경해야 합니다. 제 실제 데이터 세트에는 50개의 범주가 있었기 때문에 모든 범주의 "값 레이블" 함수를 사용할 수 없습니다. 한 테이블의 행을 정확한 값으로 다른 테이블의 열에 연결하는 방법에 대한 아이디어가 있나요? 제가 원하는 열은 Dataset.jmp 파일의 결과 열입니다.
여기에 파일을 첨부했습니다.
매우 감사합니다!
최상의,
기본 데이터 분석 및 모델링Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법match fyou를 사용하면 변경 사항이 있는 열만 나열하면 되고, 나머지 열은 'col'(마지막 항목)로 유지됩니다.
매핑을 시작하지 않으려면 열과 사전에 일치하는 이름을 사용하기만 하면 됩니다.
또는 일관된 매핑(예: 열 이름의 첫 글자 또는 첫 두 글자)과 해당 방정식을 사용합니다.
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법Hogi님, 감사합니다. 그런데 50개가 넘는 모든 열을 다시 입력할 필요가 없는 스크립트를 제공해 주실 수 있을까요?
감사합니다 !
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법또 다른 대안은 하위 설정/For Each 없이:
names default to here(1);
dict = Open( "$DOWNLOADS/Dictionary1.jmp" );
dt = Open( "$DOWNLOADS/Dataset1.jmp" );
// stack the data for easy application of the dictionary
dt2=dt << Stack(
columns(
:ETHNICITY, :ETHCAT, :SEX, :NAME, :"A09:05"n, :"A01:01"n, :DPA05, :DPB04
),
Source Label Column( "col" ),
Stacked Data Column( "values" )
);
// add a column with the corrected column-identifiers
dt 2 << New Column( "column",
Character,
Formula(
Match( :col,
"A01:01", "A",
"A09:05", "A",
"DPA05", "DP",
"DPB04", "DP",
:col
)
)
);
<BR />// add the labels from the disctionary
dt2 <<
Update(
With( dict ),
Match Columns( :column = :Column, :values = :Values ),
Add Columns from Update Table( :Labels )
);<BR />
// convert back to a wide table
dt2 <<
Split(
Split By( :col ),
Split( :Labels ),
Group( :ID ),
Remaining Columns( Drop All )
);
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법이 경우에는 올바른 하위 집합을 얻기 위해 매핑을 추가하기만 하면 됩니다. 예를 들어 Jarmos 코드에서:
colMapping = Associative array({{"SEX","SEX"},{"NAME","NAME"},{"A09:05","A"},{"A01:01","A"},{"DPA05","DP"},{"DPB04","DP"}});
colIndex= colMapping[col];
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == colIndex)), Selected Columns(0), Invisible);
대안 아이디어: Recode에는 원하는 것과 매우 가까운 기능이 있습니다. 테이블에서 매핑 적용


현재 올바른 하위 집합을 지정하는 설정이 없습니다. 따라서 이러한 매핑을 정기적으로 적용하고 다른 사용자도 적용하는 경우 이러한 설정으로 기능을 향상시키려는 소원을 Wish List에 게시할 수 있습니다...
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법짐과 자르모, 고맙습니다.
토론 커뮤니티에서 많은 것을 배웁니다. 도와주셔서 감사합니다. 제가 하고 싶은 일과 관련된 주제를 찾으려고 노력했고 이 커뮤니티에서 답변을 얻었습니다. JIM과 여러분이 주신 스크립트는 작업입니다. 하지만 제 실제 데이터는 예제보다 더 복잡합니다. 예를 들어, 데이터 세트에 여러 열이 있는 동일한 사전을 사용하는 경우, 예를 들어 새 데이터 세트1과 사전1을 첨부한 경우입니다. 1개의 열이 동일한 패턴으로 다른 열과 공유되는 경우 스크립트를 수정할 수 있습니까? 사전 A와 열 A01, A08, A9,...
새로운 데이터세트를 여기에 첨부했습니다.
최상의,
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법저는 Jim이 제공한 솔루션부터 시작할 것입니다. JMP에서 제공하는 JSL을 더 많이 활용하고 있기 때문입니다. 하지만 이 글은 제가 JSL과 JMP에 대한 많은 경험을 쌓은 후에 쓸 것입니다. (제 업무 중 일부는 스크립팅으로 JMP를 자동화하고 JSL로 JMP에 추가 기능을 추가하는 것입니다...)
더 보기...
Names Default To Here(1);
dt_data = Open("$DOWNLOADS/Dataset.jmp");
dt_dict = Open("$DOWNLOADS/Dictionary.jmp");
Column(dt_dict, "Values") << Set Data Type("Numeric");
/*
// Not really sure if this "fix" should be done or not
missing_rows = Loc(dt_dict[0, "Values"], .);
If(N Rows(missing_rows) > 0,
dt_dict[missing_rows, "Values"] = 0;
);
*/
Summarize(dt_dict, cols = By(:Column));
For Each({col}, cols,
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == col)), Selected Columns(0), Invisible);
Column(dt_dict_subset, "Labels") << Set Name("Result " || col);
dt_data << Update(
With(dt_dict_subset),
Match Columns(Eval(col) = :Values),
Add Columns from Update Table(Eval("Result " || col))
);
Close(dt_dict_subset, no save);
);
Write();
첫째, Jim이 제공한 옵션을 확실히 완전히 이해해야 합니다. 그런 다음 이와 비슷한 것을 활용하는 것을 생각해 볼 수 있습니다(프로그래밍에 대한 이해가 okeish한 경우). 기본적으로 JMP에서 제공할 수 있는 대부분의 코드를 건너뛰는 것입니다(Open()과 << Update의 대부분은 JMP에서 제공).
JSL과 JMP 자동화 방법을 배우고 싶다면 이전 단계를 거치기 전에 내 솔루션으로 바로 건너뛰지 마십시오.
- 순수하게 JMP에서 제공하는 스크립트로 시작하세요
- 약간 개선합니다(예: "하드코딩된" 테이블 이름 대신 변수 활용)
- "프로그래밍"을 믹스에 추가하기 시작하세요. 여기가 제가 Jim의 솔루션이 속한다고 생각하는 곳입니다(예를 들어 JMP가 제공할 수 없는 루프와 Word() 함수 활용)
- 결국 JMP에서 제공하는 JSL(테이블 열기, 테이블 업데이트)을 부분적으로 활용하는 내 솔루션과 유사한 것을 얻게 됩니다.
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법여기 당신이 원하는 것에 대한 좋은 시작이 있습니다. 당신은 이것을 확장하여 당신의 최종 요구 사항의 불일치를 충족시킬 수 있어야 합니다.
JMP 도움말에서 제공되는 스크립팅 가이드를 읽을 시간을 내지 않았다면, 꼭 읽어보시길 권합니다. 또한, 아래 예제를 공부해서 함수와 문장의 논리와 세부 사항을 이해하도록 하세요.
names default to here(1);
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
dt = Open( "$Downloads/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
dtDict = Open( "$Downloads/Dictionary.jmp" );
/*// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );*/
// Change column modeling type: Values
Data Table( "Dictionary" ):Values << Set Modeling Type( "Continuous" );
// Create a new dictionary data table for each level of the Column column
dtDictList = dtDict << Subset(
By( :Column ),
All rows,
Selected columns( 0 ),
Selected rows( 0 )
);
/*// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );*/
// Clear row selection
//Data Table( "Dataset.jmp" ) << Clear Select;
dt << Clear Column Selection();
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
/*// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );*/
For Each( {thedt, index}, dtDictList,
// Get the dataset column to join with
joinColumn = Word( 3, Char( thedt ), "=\!"" );
// Join data tables
// → Data Table( "untitled 1925" )
newDT = dt << Join(
With( thedt ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( Column( joinColumn ) = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 ),
Output Table( "Join of Dataset with Column=ETHCAT" )
);
NewDt:Labels << set name( joinColumn || " Labels" );
NewDt:Values << set name( joinColumn || " Values" );
If( index > 1,
Close( dt, nosave )
);
dt = newDT;
);Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법안녕하세요 짐, 정말 감사합니다. 제안하신 내용이 잘 먹힙니다. 하지만 150개의 행과 다양한 카테고리(ETHCAT, ETHNICITY 등 5~30개 그룹)가 있는 사전이 있고, 데이터 세트 테이블에 300개 열과 조인해야 하는 열이 있다면요. 솔직히 말해서, 수동으로 하는 건 어렵고, 여러 개의 테이블을 조인해야 합니다. 1. 사전 파일에서 같은 것을 분류하는 방법과 모든 데이터 세트 열을 사전 1개 파일로 조인하는 방법에 대한 스크립트를 제공해 주시겠습니까? 제가 시도하는 스크립트는 이겁니다. 하지만 스크립트를 수정할 수 없습니다.
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
Open( "$DOWNLOADS/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
Open( "$DOWNLOADS/Dictionary.jmp" );
// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Change column info: Values
Data Table( "Subset of Dictionary 2" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Clear row selection
Data Table( "Dataset.jmp" ) << Clear Select;
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );
// Join data tables
// → Data Table( "untitled 1925" )
Data Table( "Dataset.jmp" ) << Join(
With( Data Table( "Subset of Dictionary 2" ) ),
By Matching Columns( :ETHCAT = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
매우 감사합니다,
최상의,
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법행과 열의 수가 문제를 일으키는 이유는 무엇일까요? 다른 조회(ETHCAT, ETHNICITY 등)의 수가 더 많으면 하위 설정과 병합을 루프에 넣기만 하면 됩니다. 그러나 시작은 1~2개 그룹에 대해 대화형으로 수행한 다음 JMP에서 생성한 JSL을 사용하여 해당 작업을 수행하고 스크립트에 넣는 것입니다. 그런 다음 단계의 루프를 스크립트에 추가할 수 있습니다.
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법열 속성을 통해 가상 조인을 사용할 수 있습니다.
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법안녕하세요 짐, 아이디어 감사합니다. 하지만 열이 50개가 넘고 행이 1000개가 넘는데, 더 큰 데이터 세트에 대한 아이디어가 있나요?
최상의,
Re: 한 테이블의 열 코드를 다른 테이블 데이터 세트에 연결하는 방법조사하다
테이블 => 조인
하위 집합 데이터 테이블 사전 열별 열은 ETHCAT에 대한 테이블과 ETHNICITY에 대한 테이블로 만듭니다. 값 열을 숫자 열로 변경합니다. ETHNICITY 데이터 테이블의 경우 Null 또는 Missing은 Value가 . 값을 갖고 하나는 0 값을 갖는 두 행으로 확장해야 합니다.
각 하위 집합 테이블을 dataset이라는 데이터 테이블에 조인하여 한 테이블의 ETHNICITY와 Value를 조인하고, 두 번째 테이블의 ETHCAT와 Value를 조인합니다.