R 在data.table中跨组(不在组内)随机排序

R 在data.table中跨组(不在组内)随机排序,r,random,data.table,R,Random,Data.table,假设我想按物种对iris数据集(作为data.table)进行排序,将观察结果按物种分组,并跨物种随机排序 我该怎么做 我不是说在群体(物种)中生成随机顺序 我的直觉是写下面的代码。但它实际上创造了物种内的随机变量。好吧,至少它让这个问题可以重现 d <- iris %>% data.table set.seed('12345') d[,g:=runif(.N),Species] d%data.table set.seed('12345') d[,g:=runif(.N),物种]

假设我想按物种对
iris
数据集(作为
data.table
)进行排序,将观察结果按物种分组,并跨物种随机排序

我该怎么做

我不是说在群体(物种)中生成随机顺序

我的直觉是写下面的代码。但它实际上创造了物种内的随机变量。好吧,至少它让这个问题可以重现

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

我们可以从系列1…N中随机抽样,其中N是相关因子(
物种
)的水平

然后,我们将新的顺序映射到一列并按其排序。分解为步骤进行说明,如下所示:

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),]

tmp或者您可以:

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

e您可以在
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

d所以基本上你只想让物种的顺序按随机的顺序分组?@Hack-R,对了我想我可以分三步完成:set.seed('12345')d[,u:=runif(.N)]d[,u2:=max(u),species]d[顺序(u2)]%>%View
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