簡體   English   中英

向量化條件隨機匹配

[英]Vectorized Conditional Random Matching

我想創建條件隨機對而不使用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然后將對應的行ID作為df$partner而不是NA返回”。

可在此處找到條件隨機配對的for循環的一個示例: 單擊

我很確定這是非常基本且可行的,但是任何幫助都值得贊賞!

大概,您希望類型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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM