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】:您可以像这样使用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 以避免计算所有可能的组合。
【讨论】:
谢谢。我希望有一个更简单的方法。探索 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 在数据表中生成随机配对的主要内容,如果未能解决你的问题,请参考以下文章