複数対複数の関係に対処するために新しい ID を作成します*アップデート
申し訳ありませんが、質問をもっと明確にする必要があります。 現在私が持っているデータは次のようになります。
IDメール
1a
1b
2a
2c
3d
情報が重複しているため、ID 1 2 と電子メール abc は実際には同一人物であることがわかります。
ここでやろうとしているのは、元のテーブルと照合して重複するものが実際に同一人物であることを識別するために使用できる新しいキーを持つ一致テーブルを作成することです。
newID ID/メールアドレス
111 1
111 2
111a
111b
111c
222日
新しい ID は特定の形式である必要はなく、「一意の個人」を識別するために使用できる限り、元の ID と同じでもかまいません。
-------------------------------------
こんにちは。2 列のデータがあり、1 つは個人 ID、もう 1 つはメールです。 このデータの問題は、個人 ID と電子メールの関係が複数対複数であることです。つまり、1 つの個人 ID に複数の電子メールが存在する可能性があり、1 つの電子メールに複数の個人 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 には異なる個別の 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 としてグループ化されていることがわかります。 IndividualID が他のグループと重複していない場合、メールアドレスを持たないグループはそれぞれ独自の newID を持つ必要があります。 ありがとう!

Re: 複数対複数の関係に対処するために新しい ID を作成しますそれらはどのように扱われるべきでしょうか? ほとんどの場合、それは 1 つまたは 2 つの 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 を作成しますジャーモさん、本当にありがとうございました! あなたのスクリプトからのこの結果は、まさに私が必要としているものです。 私はスクリプトに詳しくないので、現在のテーブルにスクリプトを適用する方法について次の質問を 1 つだけ教えてください。 2 つの列名は「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 を作成しますデールさん、ありがとう! はい、それは正当な指摘ですが、このビジネス ケースでは、他の行動の順序を計算するために、同じ電子メールを持つ人々を 1 人の人物として扱うことにしました。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 を作成しますこれをスクリプト化する人が必要だと思います。さまざまな方法を試しましたが、うまくいくものは何も得られないようです。また、非常に多くの手順が必要であり、それだけの価値があるとは思えません。しかし、この状況は少し奇妙だと思います。よくあることですが、複数の電子メール アドレスを持っている人がいますが、同じ電子メール アドレスを使用している人も複数いるということも起こります。ただし、一意の人物を識別したいと考えています。同じ電子メール アドレスを共有する 2 人の人物が実際には 1 人の人物に過ぎないとなぜ言えるのかわかりません。あなたの例では、個人 ID #2 は他のユーザーと電子メール アドレスを共有しているため、一意の個人として除外したいようです。しかし、それはなぜ彼らが特別な人物ではないことを意味するのでしょうか?この問題を必要以上に複雑にしている可能性はありますか?私の傾向としては、一意の ID のみに焦点を当て、それらに関連付けられている電子メール アドレスのリスト、つまり単純な表作成機能が必要になると思います。
Re: 複数対複数の関係に対処するために新しい ID を作成しますこんにちは、デール! 元の投稿の情報を更新しました。 ぜひチェックしてください、ありがとうございます!Re: 複数対複数の関係に対処するために新しい ID を作成しますこんにちは、ポール! 元の投稿の情報を更新しました。 ぜひチェックしてください、ありがとうございます!Re: 複数対複数の関係に対処するために新しい ID を作成します(私の例のように)表を作成してからデータテーブルを作成し、連結する列(「,」を挿入したい場合は複数連結)を作成することでそれを行うことができると思います。
Re: 複数対複数の関係に対処するために新しい ID を作成します必要なのは次のようなテーブルだと思います。
次のような表から:
| ID | Eメール |
| 10 | ... |
| 11 | ... |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18 | .. |
しかし、どの ID とどのメールが同じ人物のものであるかをどのようにして知るのかは私には不明瞭なので、それが私の質問の内容です。
Re: 複数対複数の関係に対処するために新しい ID を作成しますあなたが何を望んでいるのか理解できないと思います。2 つの列を連結するだけで、観測ごとに固有の人物と電子メールの組み合わせが得られるように思えます。各人または各メールを独自の行に表示したい場合は、表を使用してください。表と一意の識別子を持つ新しい列を含む、複数対複数のマッピングを示すサンプル テーブルを添付しました。この例を使って、何が欲しいかを伝えることができるかもしれません。
Re: 複数対複数の関係に対処するために新しい ID を作成しますでは、固有の個人を表す固有の番号を示す情報はどこで入手できるのでしょうか? あなたが説明しているこれら 2 つの列のみに基づいて、列の 1 つを一意の識別子にし、もう 1 つをそれにマップする以外に選択肢はありません。 サンプルデータを投稿してみてはいかがでしょうか?