矢量化条件随机匹配

时间:2017-04-17 17:23:36

标签: r

我想在不使用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

我很确定这是非常基本和可行的,但是,任何帮助都会受到赞赏!

1 个答案:

答案 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