在data.table

时间:2018-07-05 19:22:28

标签: r random data.table

比方说,我想按物种对iris数据集(作为data.table进行排序),将观察结果按物种分组并在物种间随机排序。

我该怎么做?

我不是在谈论在群体(物种)中产生随机秩序。

我的直觉是编写下面的代码。但是它实际上创建了物种内部随机变量。至少可以使问题重现

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

3 个答案:

答案 0 :(得分:2)

您可以在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 :(得分:1)

我们可以从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)]),]

答案 2 :(得分:1)

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

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