1

我有以下示例数据表。

   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

提前致谢

4

2 回答 2

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 数量很大,您需要类似此函数的功能来避免计算所有可能的组合。

于 2013-08-18T18:23:24.083 回答
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
于 2013-08-19T15:36:36.490 回答