簡體   English   中英

在data.table中跨組(不在組內)隨機排序

[英]randomly ordering across groups (not within group) in data.table

假設我想按物種對iris數據集進行排序(作為data.table ),保持觀察結果按物種分組並在物種間隨機排序。

我怎么做?

我不是在談論在群體(物種)中產生隨機秩序。

我的直覺是編寫下面的代碼。 但是它實際上創建了物種內部隨機變量。 至少它可以使問題重現

d <- iris %>% data.table
set.seed('12345')
d[,g:=runif(.N),Species]

您可以在i進行二進制搜索。 一個較小的示例:

d <- data.table(Species = rep(letters[1:4], each = 2), ri = 1:8)
set.seed(1)
d[.(sample(unique(Species))), on = "Species"]
#    Species ri
# 1:       b  3
# 2:       b  4
# 3:       d  7
# 4:       d  8
# 5:       c  5
# 6:       c  6
# 7:       a  1
# 8:       a  2

我們可以從1 ... N系列中隨機抽取樣本,其中N是所討論的因子( Species )的水平數。

然后,我們將新訂單映射到一列並對其進行排序。 分為多個步驟進行說明,如下所示:

tmp      <- sample_n(as.data.frame(seq(1,length(unique(d$Species)))),3)[,1]
d$index  <- tmp[as.numeric(d$Species)]
d        <- d[order(d$index),]

您可以將其壓縮為1行/步:

d <- d[order(sample_n(as.data.frame(seq(1,length(unique(d$Species)))),3)[,1][as.numeric(d$Species)]),]

或者,您可以執行以下操作:

e <- d[, .N, Species]
e[, g2 := runif(.N)]
d <- e[, .(Species, g2)][d, on = 'Species']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM