我想在不使用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循环的一个示例:click
我很确定这是非常基本和可行的,但是,任何帮助都会受到赞赏!
答案 0 :(得分: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