образец из data.table - PullRequest
       16

образец из data.table

1 голос
/ 25 июня 2019

У меня есть некоторый data.table, из которого я хочу выбрать случайное подмножество, но только для некоторых операций.

Предположим, данные

dat <- data.table(id=1:100, group=sample(1:20,100, replace=TRUE), a=runif(100), b=rnorm(100))

и я хочу сделать две вещи:

  1. подсчитать количество идентификаторов на группу
  2. выберите из каждой группы по одному случайному идентификатору и запишите его значение в a и b

Я мог бы следовать Как вы извлекаете несколько случайных строк из таблицы данных на лету и выбираете

dat[n=.N, a=a[sample(.N,1)], b=b[sample(.N,1)], group]

но я боюсь, это выберет a и b независимо друг от друга. Есть ли способ выбрать один и тот же?

1 Ответ

7 голосов
/ 25 июня 2019

часть 1

Если вы хотите посчитать количество уникальных идентификаторов и некоторые идентификаторы повторяются в группах

dat[, .(n_ids = uniqueN(id)), group]

Если идентификаторы не повторяются внутри групп или вы не хотите считать их уникальным образом

dat[, .(n_ids = .N), group]

Часть 2

Если идентификаторы повторяются внутри групп, и вы хотите вернуть все строки для случайно выбранного идентификатора в каждой группе

dat[dat[, .(id = sample(id, 1)), group], on = .(id, group)]

Если идентификаторы не повторяются или вы все равно хотите иметь только одну строку на группу

dat[dat[, sample(.I, 1), group]$V1]

Благодаря комментарию Фрэнка вы также можете сделать второй вариант для частей 1 и 2 выше в одну строку. Это возвращает строку, подобную dat[dat[, sample(.I, 1), group]$V1], но также добавляет столбец N, показывающий количество идентификаторов (предполагается, что он равен числу строк в группе)

dat[sample(.N), c(.SD[1], .N), keyby=group]
...