다중 대 다중 관계를 처리하기 위해 새 ID를 작성하십시오.*업데이트
죄송합니다. 질문에 대해 더 명확해야합니다. 현재 가지고 있는 데이터는 다음과 같습니다.
아이디 이메일
1시
1b
2시
2c
3일
id 1 2와 email abc는 정보가 겹쳐서 실제로 같은 사람임을 알 수 있습니다.
여기서 제가 하려는 것은 새로운 키가 있는 데이터 이동 색인을 생성하는 것입니다. 이 데이터 이동 색인을 사용하여 원본 테이블과 다시 일치시켜 겹치는 항목이 실제로 같은 사람인지 식별할 수 있습니다.
newID 아이디/이메일
111 1
111 2
111a
111b
111c
222일
newID는 특정 형식일 필요가 없으며 "고유한 사람"을 식별하는 데 사용할 수 있는 한 원래 ID와 같을 수도 있습니다.
-------------------------------------
안녕하세요, 2개의 열이 있는 데이터가 있는데 하나는 개인 ID이고 다른 하나는 이메일입니다. 이 데이터의 문제는 개별 ID와 이메일 간의 관계가 다중 대 다중이라는 것입니다. 즉, 하나의 개별 ID가 여러 개의 이메일을 가질 수 있고 하나의 이메일이 여러 개의 개별 ID를 가질 수 있습니다. 따라서 모든 개별 ID/이메일에 대한 새로운 고유 ID의 매핑 테이블을 생성해야 합니다. 이 매핑 테이블은 겹치는 경우 개별 ID 또는 이메일이 실제로 동일한 사람임을 지정합니다. 스크립트 없이는 방법을 생각할 수 없었습니다. 누구든지 도울 수 있습니까? 감사합니다!
데이터 혼합 및 정리품질 및 프로세스 엔지니어링Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.자모 정말 감사합니다! 효과가있다!!Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.누락된 값을 처리하는 방법을 잘못 읽고/이해했습니다. 당신은 그들 각각에 고유한 가치를 원합니다, 그렇죠? 누락된 값은 마지막으로 처리되기 때문에 //handle missing 뒤에 있는 마지막 행을 아래 스크립트로 바꿀 수 있습니다.
//handle missings
For Each Row(dt,
If(IsMissing(:newid),
index++;
dt:newId = index;
);
);
</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-366610" slang="en-US" mode="NONE">Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.</LINGO-SUB><LINGO-BODY id="lingo-body-366610" slang="en-US" mode="NONE"><P>안녕하세요 Jarmo, 결과는 첨부된 스크린샷과 같이 이전 결과와 동일한 것 같습니다. "newid1"은 이전 스크립트를 사용하는 것이고 "newid"는 이전 스크립트와 동일한 최신 스크립트를 사용하는 것이며 빈 이메일이 있는 다른 개별 ID에 동일한 newid "750"을 할당했습니다. 확인해 주시겠어요? 감사합니다!</P><P> </P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" style="width: 143px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" style="width: 143px;"><span class="lia-inline-image-display-wrapper" image-alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" style="width: 143px;"><img src="https://us.v-cdn.net/6038925/uploads/images/31129i40283FF98CA6E0FA/Screen%20Shot%202021-03-09%20at%203.56.12%20PM.png" role="button" title="Screen Shot 2021-03-09 at 3.56.12 PM.png" alt="Screen Shot 2021-03-09 at 3.56.12 PM.png" /></span></SPAN></SPAN></P></LINGO-BODY><LINGO-SUB id="lingo-sub-366510" slang="en-US" mode="NONE">Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.</LINGO-SUB><LINGO-BODY id="lingo-body-366510" slang="en-US" mode="NONE"><P>결과를 복제할 수 없습니다(대부분 308로 시작하는 개별 ID가 다를 수 있습니다....).</P><P> </P><P>이 모양의 결과가 정확합니까?</P><PRE><CODE class=" language-jsl">Names Default To Here(1);
//https://community.jmp.com/t5/Discussions/create-new-id-to-deal-with-multiple-to-multiple-relationship/m-p/365298#M61470
/*
dt = New Table("Untitled",
Add Rows(20),
Compress File When Saved(1),
New Column("Individualid",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 8, 9])
),
New Column("Email_HASHED",
Character,
"Nominal",
Set Values(
{"a", "b", "a", "c", "d", "e", "f", "g", "a", "h", "i", "j", "k", "l",
"m", "n", "o", "p", "q", "b"}
)
)
);
*/
dt = New Table("Untitled",
Add Rows(19),
Compress File When Saved(1),
New Column("Individualid",
Numeric,
"Continuous",
Format("Best", 12),
Set Values(
[139, 100, 229, 301, 308, 284, 682, 136, 586, 256, 122, 711, 629, 116,
152, 443, 301, 695, 311]
)
),
New Column("Email_HASHED",
Character,
"Nominal",
Set Values(
{"A648", "CAA", "E7B", "5B2", "", "237A", "", "FE0", "", "7C21", "",
"920B", "", "D394", "", "2FE1", "", "", ""}
)
)
);
dt << Size Window(500,900);
dt << New Column("newid", numeric, ordinal);
//setup first values before While loop
rowList = [1];
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0];
index = 1;
//looping
While(1,
oldRowList = rowList;
Remove From(emailList, Contains(emailList, ""));
rowList = dt << Get Rows Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED));
//dt << Select Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED)); //for visualization
//wait(1); //for visualization
If(N Items(oldRowList) != N Items(rowList),
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0],
If(All(oldRowList == rowList),
dt:newid[rowList] = index;
newRow = Contains(dt:newid << get as matrix, .);
newRow = 0;
For Each Row(dt,
If(:Email_HASHED != "" & IsMissing(:newId),
newRow = Row();
break();
)
);
If(newRow == 0,
break(),
);
index += 1;
rowList = Matrix(newRow);
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0];
);
);
);
//dt << Clear Select;
//handle missings
index++;
missingRows = dt << Get Rows Where(IsMissing(:newId));
dt:newId[missingRows] = index
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.안녕하세요 Jarmo, 아래는 예입니다. 빈 이메일이 있는 많은 행이 모두 newid 5로 그룹화되는 것을 볼 수 있습니다. 개별 ID가 다른 그룹과 중복되지 않는 경우 이메일이 없는 그룹은 각각 고유한 newid를 가져야 합니다. 감사합니다!

Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.어떻게 처리해야 합니까? 아마도 하나 또는 두 개의 if 문일 것입니다.
정답이 있는 작은 예제 데이터 세트가 도움이 될 수 있습니다.
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.안녕하세요 Jarmo, 이메일 열에 빈 셀이 있는 일부 행이 있다는 것을 언급하는 것을 잊었습니다. 즉, 일부 개별 ID에는 이메일 열 아래에 아무것도 채워져 있지 않습니다. 나는 현재 스크립트가 이메일이 없는 모든 개별 ID를 동일한 새 ID로 간주한다는 것을 발견했습니다. 이런 상황을 피하기 위해 스크립트를 조정하는 데 도움을 줄 수 있습니까? 감사합니다!Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.정말 고마워요! 효과가있다!! 도움을 주셔서 감사합니다.Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.데이터 테이블을 가져오는 방법에 따라 직접 참조할 수 있습니다.
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt1 = dt << Subset(All rows);
dt2 = Query(dt, "SELECT name, age, height FROM 'Big Class' WHERE age > 14; ");등등
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.dt = current data table();
또는
dt = Data table("Name of table here")Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.자모 감사합니다! dt를 현재 데이터 테이블로 변경하지만 입력한 샘플로 새 테이블을 생성하지 않으려면 어떻게 해야 합니까?Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.나는 스크립트를 약간 수정했습니다 (재귀는 때때로 이해하기 어려울 수 있으므로 재귀를 while 루프로 변경했습니다). 열 이름도 변경되었습니다.
Names Default To Here(1);
//https://community.jmp.com/t5/Discussions/create-new-id-to-deal-with-multiple-to-multiple-relationship/m-p/365298#M61470
dt = New Table("Untitled",
Add Rows(20),
Compress File When Saved(1),
New Column("Individualid",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 8, 9])
),
New Column("Email_HASHED",
Character,
"Nominal",
Set Values(
{"a", "b", "a", "c", "d", "e", "f", "g", "a", "h", "i", "j", "k", "l",
"m", "n", "o", "p", "q", "b"}
)
)
);
dt << Size Window(500,900);
dt << New Column("newid", numeric, ordinal);
//setup first values before While loop
rowList = [1];
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0];
index = 1;
//looping
While(1,
oldRowList = rowList;
rowList = dt << Get Rows Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED));
dt << Select Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED)); //for visualization
wait(1); //for visualization
If(N Items(oldRowList) != N Items(rowList),
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0],
If(All(oldRowList == rowList),
dt:newid[rowList] = index;
newRow = Contains(dt:newid << get as matrix, .);
If(newRow == 0,
break(),
);
index += 1;
rowList = Matrix(newRow);
idList = dt:Individualid[rowList,0];
emailList = dt:Email_HASHED[rowList,0];
);
);
);문제를 일으킬 수 있는 수정된 버전에서 dt 참조를 제거한 것으로 나타났습니다.
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.정말 고마워요! 귀하의 스크립트에서 나온 이 결과는 정확히 제가 필요한 것입니다. 나는 스크립트에 익숙하지 않으므로 현재 테이블에 적용하는 방법에 대한 다음 질문 하나뿐입니다. 두 열 이름은 "Individualid" 및 "Email_HASHED"입니다. 아래 편집된 스크립트를 내 테이블에 붙여넣었지만 오류가 표시되었습니다. 나를 위해 디버깅할 수 있습니까? 감사합니다!
New Column("newid", numeric, ordinal);
createIndex = function({tempRows, index},
wait(0.5); //for visualization
idList = Individualid[tempRows,0];
emailList = Email_HASHED[tempRows,0];
tempRowsNew = Get Rows Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED));
Select Where(Contains(idList, :Individualid) | Contains(emailList, :Email_HASHED)); //for visualization
wait(0.5); //for visualization
If(N Items(tempRows) != N Items(tempRowsNew),
ids = Individualid[tempRowsNew,0];
emails = Email_HASHED[tempRowsNew,0];
Recurse(tempRowsNew, index),
If(All(tempRows == tempRowsNew),
newId[tempRowsNew] = index;
newRow = Contains(newId << get as matrix, .);
If(newRow == 0,
Clear Select;
return("done"),
ids = Individualid[newRow,0];
emails = Email_HASHED[newRow,0];
Recurse(matrix(newRow), index + 1);
);
)
);
);
wait(1);
createIndex([1], 1);
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.데일 감사합니다! 예, 유효한 지적이지만 이 비즈니스 사례의 경우 다른 행동의 순서를 계산하기 위해 동일한 이메일을 가진 사람들을 한 사람으로 취급하기로 결정했습니다.Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.이것은 확실히 이것으로 약간 이상한 방법으로 보입니다. @dale_lehman 말했다. 최소한 재귀를 사용하여 스크립트를 작성할 수 있습니다. 아래는 적어도 내 예제 데이터와 함께 작동하는 것처럼 보이는 매우 지저분한 예제 코드입니다(아이디어를 올바르게 이해한 경우).
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(20),
Compress File When Saved(1),
New Column("id",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 7, 8, 9])
),
New Column("email",
Character,
"Nominal",
Set Values(
{"a", "b", "a", "c", "d", "e", "f", "g", "a", "h", "i", "j", "k", "l",
"m", "n", "o", "p", "q", "b"}
)
)
);
dt << Size Window(500,900);
dt << New Column("newid", numeric, ordinal);
createIndex = function({tempRows, index},
wait(0.5); //for visualization
idList = dt:id[tempRows,0];
emailList = dt:email[tempRows,0];
tempRowsNew = dt << Get Rows Where(Contains(idList, :id) | Contains(emailList, :email));
dt << Select Where(Contains(idList, :id) | Contains(emailList, :email)); //for visualization
wait(0.5); //for visualization
If(N Items(tempRows) != N Items(tempRowsNew),
ids = dt:id[tempRowsNew,0];
emails = dt:email[tempRowsNew,0];
Recurse(tempRowsNew, index),
If(All(tempRows == tempRowsNew),
dt:newId[tempRowsNew] = index;
newRow = Contains(dt:newId << get as matrix, .);
If(newRow == 0,
dt << Clear Select;
return("done"),
ids = dt:id[newRow,0];
emails = dt:email[newRow,0];
Recurse(matrix(newRow), index + 1);
);
)
);
);
wait(1);
createIndex([1], 1);무슨 일이 일어나고 있는지 보여주기 위해 기능 내부에 추가 Select Where 및 Waits를 추가했습니다.
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.이 스크립트를 작성할 사람이 필요하다고 생각합니다.나는 여러 가지 방법을 시도했지만 작동하는 것을 얻을 수 없는 것 같습니다. 너무 많은 단계가 관련되어 그만한 가치가 없는 것 같습니다.그러나 상황이 약간 이상하다고 생각합니다. 일반적으로 여러 이메일 주소를 가진 사람들이 있지만 동일한 이메일 주소를 사용하는 여러 사람도 있습니다.그러나 고유한 사람을 식별하고 싶어합니다. 동일한 이메일 주소를 공유하는 두 사람이 실제로는 한 사람일 뿐이라고 말하는 이유를 모르겠습니다.귀하의 예에서 사람 ID #2는 다른 사람과 이메일 주소를 공유하기 때문에 고유한 사람으로 제외하려는 것으로 보입니다.그러나 그것이 그들이 독특한 사람이 아니라는 것을 의미하는 이유는 무엇입니까?이 문제를 필요 이상으로 복잡하게 만들 가능성이 있습니까?내 성향은 고유 ID에 초점을 맞춘 다음 간단한 표 기능인 고유 ID와 연결된 이메일 주소 목록을 원하는 것입니다.
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.안녕 데일! 원래 게시물의 정보를 업데이트했습니다. 확인해주세요, 감사합니다!Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.안녕 폴! 원래 게시물의 정보를 업데이트했습니다. 확인해주세요, 감사합니다!Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.내 예에서와 같이 표로 만든 다음 데이터 테이블로 만든 다음 연결하는 열을 만들어서 그렇게 할 수 있다고 생각합니다(", "를 삽입하려는 경우 여러 연결).
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.필요한 것은 다음과 같은 테이블이라고 생각합니다.
다음과 같은 테이블에서:
| ID | 이메일 |
| 10 | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18 | .. |
하지만 어떤 ID와 이메일이 같은 사람의 것인지 어떻게 알 수 있는지 명확하지 않아서 제 질문에 대한 것이었습니다.
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.나는 당신이 원하는 것을 이해하지 못하는 것 같습니다.두 개의 열을 연결할 수 있고 각 관찰에 대해 고유한 사람/이메일 조합을 가질 수 있는 것처럼 들립니다.각 사람 또는 각 이메일을 자체 행에 표시하려면 Tabulate를 사용하십시오.고유 식별자가 있는 새 열과 함께 Tabulation이 포함된 다중-다중 매핑을 보여주는 샘플 테이블을 첨부했습니다.이 예를 사용하여 원하는 것을 말할 수 있습니다.
Re: 다중 대 다중 관계를 처리하기 위해 새 ID를 생성합니다.고유 번호가 고유한 사람인지 알려주는 정보는 어디에서 얻을 수 있습니까? 당신이 설명하는 이 두 열만을 기반으로 열 중 하나를 고유 식별자로 만들고 다른 열을 여기에 매핑하는 것 외에 다른 선택의 여지가 없습니다. 예시 데이터를 게시할 수 있나요?