случайное упорядочение по группам (не внутри группы) в data.table - PullRequest
0 голосов
/ 05 июля 2018

Допустим, я хочу упорядочить набор данных iris (как data.table) по видам, сохраняя наблюдения, сгруппированные по видам, и случайным образом упорядочивая по видам.

Как мне это сделать?

Я не говорю о генерации случайного порядка внутри групп (видов).

Моя интуиция заключалась в том, чтобы написать код ниже. Но это фактически создает случайную переменную внутри вида. Ну, по крайней мере, это делает вопрос воспроизводимым

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

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

В качестве альтернативы вы можете сделать:

e <- d[, .N, Species]
e[, g2 := runif(.N)]
d <- e[, .(Species, g2)][d, on = 'Species']
0 голосов
/ 06 июля 2018

Вы можете выполнить бинарный поиск в 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
0 голосов
/ 05 июля 2018

Мы можем случайно выбрать из серии 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)]),]
...