R data.table在数据表中生成随机配对

时间:2013-08-18 17:59:03

标签: r data.table

我有以下样本数据表。

   id val
1:  a   1
2:  b   3
3:  c   2
4:  d   1

我想在id列中进行随机配对,但我不希望id与自身配对。使用data.tables执行此操作的最有效方法是什么?我尝试过的一种方法是首先在数据表中找到随机行,如下所示

x = x[sample(nrow(x),1),]

然后我遇到了一个阻止,因为我必须运行检查以确保当前索引不存在于返回的索引中。这在计算上会很昂贵。例如,可能的输出结果是

  id val id.pair val.pair
1: a  1  b  3
2: b  3  c  2
3: c  2  a  1
4: d  1  a  1

提前致谢

2 个答案:

答案 0 :(得分:3)

您可以像这样使用combnsample.int

df <- read.table(text="id val
a  1
b  3
c  2
d  1", header=TRUE, stringsAsFactors=FALSE)

library(data.table)
dt <- data.table(df)

set.seed(42)
combis <- combn(dt[,id], 2)[,sample.int(choose(nrow(dt),2), nrow(dt))]

setkey(dt, "id")
cbind(dt[combis[1,],], dt[combis[2,],])

#    id val id val
# 1:  c   2  d   1
# 2:  b   3  d   1
# 3:  a   1  c   2
# 4:  a   1  d   1

但是,如果您的ID数量很大,则需要something like this function以避免计算所有可能的组合。

答案 1 :(得分:2)

这是另一种方式:

set.seed(1)
DT[, paste0("pair.",names(DT)) := .SD[ sapply(.I, function(i) sample(.I[-i], 1)) ]]

给出了......

   id val pair.id pair.val
1:  a   1       b        3
2:  b   3       c        2
3:  c   2       b        3
4:  d   1       c        2