2017-04-17 16 views
0

forループを使用せずに条件付きランダムペアを作成したいので、大きなデータセットでコードを使用できます。最初は、私は、固有のIDを持つ行を作成し、ランダムに私の行に二つの異なる「種類」を割り当てる:ベクトル化条件付きランダムマッチング

df<-data.frame(id=1:10,type=NA,partner=NA) 
df[sample(df$id,nrow(df)/2),"type"]<-1 ##random 50% type 1 
df[which(is.na(df$type)==TRUE),"type"]<-2 ##other 50% type 2 
df 
    id type partner 
1 1 2  NA 
2 2 1  NA 
3 3 1  NA 
4 4 1  NA 
5 5 2  NA 
6 6 1  NA 
7 7 1  NA 
8 8 2  NA 
9 9 2  NA 
10 10 2  NA 

は今、私は彼らが反対のタイプのランダムなパートナーを受信したいです。だから、私はタイプ1のIDをランダム化し、いくつかのタイプにそれらを一致させる2 IDがそうのように:

df$partner[which(df$type==2)]<-sample(df$id[which(df$type==1)], 
              nrow(df)/2) 

df 
    id type partner 
1 1 2  4 
2 2 1  NA 
3 3 1  NA 
4 4 1  NA 
5 5 2  2 
6 6 1  NA 
7 7 1  NA 
8 8 2  6 
9 9 2  3 
10 10 2  7 

をそして、私はこだわっているところです。何らかの理由で、私はRに "タイプ1のIDを取り、これらのIDがどこにあるかをdf$partnerに見て、NAの代わりにdf$partner"という対応する行IDを返すようにベクトル化した方法を考えることはできません。条件付きランダムペアリングのためのforループのための

一つの例は、ここで見つけることができます:click

私はそれが非常に基本的でなんとかだとかなり確信している、しかし、任意のヘルプは感謝します!

答えて

1

おそらく、タイプ1とタイプ2が一致すると、それぞれのパートナーエントリにお互いのIDがあるとします。完全にベクトル化された解。

# Define number of ids 
n = 100 

# Generate startingn data frame 
df = data.frame(id = 1:n, type = NA, partner = NA) 

# Generate the type column 
df$type[(a<-sample(df$id, n/2))] = 1 
df$type[(b<-setdiff(1:100, a))] = 2 

# Select a random partner id from the other type 
df$partner[a] = sample(df$id[b]) 
# Fill in partner values based on previous line 
df$partner[b] = df$id[match(df$id[b], df$partner)] 

出力:

id type partner 
    1 2  11 
    2 1  13 
    3 2  19 
    4 2  10 
    5 1  17 
    6 2  28 
    7 2  27 
    8 2  21 
    9 1  22 
10 1  4 
11 1  1 
12 2  20 
13 2  2 
14 2  25 
15 2  24 
16 2  30 
17 2  5 
18 2  29 
19 1  3 
20 1  12 
21 1  8 
22 2  9 
23 2  26 
24 1  15 
25 1  14 
26 1  23 
27 1  7 
28 1  6 
29 1  18 
30 1  16