1

次のサンプルデータテーブルがあります。

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

列間でランダムなペアを作成idしたいのですが、ID をそれ自体とペアにしたくありません。data.tables でこれを行う最も効率的な方法は何でしょうか? 私が試した1つのアプローチは、次のようにデータテーブルで最初にランダムな行を見つけることです

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

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 の数が多い場合は、考えられるすべての組み合わせを計算しないように、この関数のようなものが必要です。

于 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 に答える