[英]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.