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

Posted

技术标签:

【中文标题】R data.table 在数据表中生成随机配对【英文标题】:R data.table generate random pairings in data table 【发布时间】:2013-08-18 17:59:02 【问题描述】:

我有以下示例数据表。

   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

提前致谢

【问题讨论】:

你确定你有一个data.table而不是一个data.frame吗?我没有看到 data.table 语法。 是的。积极。添加了熟悉的基于 ':' 的行编号。 【参考方案1】:

您可以像这样使用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 以避免计算所有可能的组合。

【讨论】:

谢谢。我希望有一个更简单的方法。探索 setdiff【参考方案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

【讨论】:

以上是关于R data.table 在数据表中生成随机配对的主要内容,如果未能解决你的问题,请参考以下文章

您如何管理在 R 中生成大数据表? (不在大桌子上阅读)

在 C++ 中生成随机双精度数

golang 在go中生成随机int数

在 R 中生成具有相同数量节点和关系的多个随机图?

R语言对dataframe(data.table)数据分层随机抽样实战

在R中生成随机块示意图