複数から複数の関係を処理するための新しいIDを作成しますこんにちは。2列のデータがあります。1つは個人ID、もう1つはメールです。 このデータの問題は、個人IDと電子メールの関係が複数から複数であるということです。つまり、1つの個人IDに複数の電子メールが含まれ、1つの電子メールに複数の個人IDが含まれる可能性があります。 したがって、すべての個人ID /電子メールへの新しい一意のIDのマッピングテーブルを作成する必要があります。これは、重複する場合はそれらの個人IDまたは電子メールが実際には同じ人物であることを指定します。 スクリプトなしでそれを行う方法を本当に考えることはできませんでした。 誰か助けてもらえますか? ありがとうございました!
分析再:複数から複数の関係を処理するために新しいIDを作成しますでは、どの一意の番号が一意の人物であるかを示す情報はどこで入手できますか? 説明しているこれらの2つの列のみに基づいて、一方の列を一意の識別子にして、もう一方の列をその列にマップする以外に選択肢はありません。 たぶんいくつかのサンプルデータを投稿しますか?
再:複数から複数の関係を処理するために新しいIDを作成します私はあなたが何を望んでいるのか理解できないと思います。2つの列を連結するだけで、観測ごとに一意の個人/電子メールの組み合わせができるように思えます。各人または各電子メールを独自の行に配置する場合は、Tabulateを使用します。集計と一意の識別子を持つ新しい列を含む、複数の複数のマッピングを示すサンプルテーブルを添付しました。おそらく、この例を使用して、必要なものを教えてください。
再:複数から複数の関係を処理するために新しいIDを作成します必要なのは次のようなテーブルだと思います。
次のようなテーブルから:
| ID | Eメール |
| 10 | ..。 |
| 11 | ..。 |
| 12 | .. |
| 15 | .. |
| 16 | .. |
| 17 | .. |
| 18 | .. |
しかし、どのIDとどの電子メールが同じ人のものであるかをどのように知ることができるかは私にはわかりません。それが私の質問でした。
再:複数から複数の関係を処理するために新しいIDを作成しますこれは、(私の例のように)表を作成し、データテーブルを作成してから、連結する列を作成することで実現できると思います( "、"を挿入する場合は複数の連結)。
再:複数から複数の関係を処理するために新しいIDを作成しますこんにちはポール! 元の投稿の情報を更新しました。 確認してください、ありがとうございます!再:複数から複数の関係を処理するために新しいIDを作成しますこんにちはデール! 元の投稿の情報を更新しました。 確認してください、ありがとうございます!再:複数から複数の関係を処理するために新しいIDを作成しますこれをスクリプト化する人が必要だと思います。私はいくつかの方法を試しましたが、うまくいくものが何も得られないようです-そして、それは価値がないように思われるほど多くのステップが含まれていました。ただし、状況は少し奇妙だと思います。よくあることですが、複数のメールアドレスを持つ人がいますが、同じメールアドレスを使用している人もいます。ただし、一意の人を特定したいのですが、同じメールアドレスを共有している2人が実際には1人だけであると言う理由がわかりません。あなたの例では、個人ID#2は他の人と電子メールアドレスを共有しているため、一意の個人として除外したいと考えているようです。しかし、なぜそれは彼らがユニークな人ではないことを意味するのでしょうか?この問題を必要以上に複雑にしている可能性はありますか?私の傾向は、一意のIDに焦点を合わせてから、それらに関連付けられている電子メールアドレスのリスト(単純な表形式の機能)が必要になることです。
再:複数から複数の関係を処理するために新しい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);関数内にSelectWhereとWaitsを追加して、何が起こっているのかを表示しようとしました。
再:複数から複数の関係を処理するために新しいIDを作成しますデールありがとう! はい、それは有効なポイントですが、このビジネスケースでは、他の行動の順序を計算するために、1人の人と同じ電子メールを持つ人を扱うことにしました。再:複数から複数の関係を処理するために新しい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);
再:複数から複数の関係を処理するために新しい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参照を削除したことがわかりました。これにより、問題が発生する可能性があります。
再:複数から複数の関係を処理するために新しいIDを作成しますジャルモありがとう! dtを現在のデータテーブルに変更し、入力したサンプルで新しいテーブルを作成しないようにするにはどうすればよいですか?再:複数から複数の関係を処理するために新しいIDを作成しますdt = current data table();
または
dt = Data table("Name of table here")