我有以下样本数据表。
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
提前致谢
答案 0 :(得分:3)
您可以像这样使用combn
和sample.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