0

データベース内の行に一意の ID を生成したいと考えています。このデータベースに継続的にエントリを追加する予定なので、並行して新しい ID を生成する必要があります。私のデータベースは比較的小さく、ランダムな ID が重複する可能性はごくわずかですが、プログラムによるフェイルセーフを構築して、過去に使用された ID を生成しないようにしたいと考えています。

手始めに、サンプル データベースの開始に使用できるサンプル データをいくつか示します。

library(tidyverse)
library(ids)
library(babynames)
    
database <- data.frame(rid = random_id(5, 5), first_name = sample(babynames$name, 5))

print(database)
          rid first_name
1  07282b1da2      Sarit
2  3c2afbb0c3        Aly
3  f1414cd5bf    Maedean
4  9a311a145e    Teriana
5  688557399a    Dreyton

以下は、既存のデータベースに追加される新しいデータを表すために使用できるサンプル データです。

new_data <- sample(babynames$name, 5)

print(new_data)

 first_name
1    Hamzeh
2   Mahmoud
3   Matelyn
4    Camila
5     Renae

今、私が望むのは、関数を使用してランダムに生成された ID の新しい列をバインドすると同時に、新しく生成された ID がオブジェクトrandom_id内の既存の ID と一致しないことを確認することです。databaseジェネレーターが同一の ID を作成した場合、理想的には、真に一意の ID が作成されるまで新しい置換を生成します。

どんな助けでも大歓迎です!

アップデート

役立つ可能性を考えましたが、まだ制限されています。新しい ID を生成し、for()ループを使用して、新しく生成された ID が既存のデータベースに存在するかどうかをテストできます。もしそうなら、私は新しいIDを再生成します。例えば...

new_data$rid <- random_id(nrow(new_data), 5)

for(i in 1:nrow(new_data)){
  if(new_data$rid[i] %in% unique(database$rid)){
    new_data$rid[id] = random_id(1, 5)
  }
}

このアプローチの問題点は、ネストされたifステートメントの無限のストリームを構築して、元のデータベースに対して新しく生成された値を継続的にテストする必要があることです。元のデータベースにはない真にユニークな値が生成されるまでテストを続けるプロセスが必要です。

4

2 に答える 2