比方说,我想按物种对iris
数据集(作为data.table
进行排序),将观察结果按物种分组并在物种间随机排序。
我该怎么做?
我不是在谈论在群体(物种)中产生随机秩序。
我的直觉是编写下面的代码。但是它实际上创建了物种内部随机变量。至少可以使问题重现
d <- iris %>% data.table
set.seed('12345')
d[,g:=runif(.N),Species]
答案 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']