Подтвердить что ты не робот

Как вы извлекаете несколько случайных строк из таблицы data.table на лету

У меня есть большая таблица данных (около 24000 строк и растет). Я хочу подмножить этот тип данных, основанный на нескольких критериях и из этого подмножества (заканчивается примерно 3000 строк). Я хочу случайным образом пробовать всего 4 строки. Я не хочу создавать именованные 3000 или около того строк data.table, подсчитывать его строки, а затем пример на основе номера строки. Как я могу сделать это на лету? Или я должен просто сосать его, создав таблицу, а затем работая над ней, сэмплируя ее, а затем используя rm(), чтобы избавиться от нее?

Позволяет моделировать мою проблему

require(data.table)
random.length  <-  sample(x = 15:30, size = 1)
data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE)) 

Это делает таблицу случайных длин, которая имитирует тот факт, что в зависимости от моих критериев и в зависимости от моей стартовой таблицы я не знаю, какая длина поднаборной таблицы с

Теперь, если мне просто нужны первые три строки, я мог бы сделать так

data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[1:3]

Но скажем, мне не нужны первые три строки, а скорее случайные 3 строки, тогда я хотел бы сделать что-то вроде этого...

data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[sample(x= 1:number of rows of that previous data.table,size = 3 ]

Это не сработает. Как я могу вычислить, на лету, какова длина начального файла data.frame?

4b9b3361

Ответ 1

Сделал только .N работу в i. Новый элемент README:

.N теперь доступен в i, FR # 724. Благодаря новичкам косвенно здесь и Farrel непосредственно здесь.

Теперь это работает:

DT[...][...][sample(.N,3)]

например.

> random.length  <-  sample(x = 15:30, size = 1)
> data.table(city = sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"),size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[sample(.N, 3)] 
         city score
1:   New York     4
2: Pittsburgh     3
3:  Cape Town     9
> 

Ответ 2

Существует двухэтапный подход:

  • Вычислить индекс i с помощью .I
  • Пример по индексу i

Пример кода.

require(data.table)
random.length  <-  sample(x = 15:30, size = 1)
data.table(city = sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"),size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE))[,i := .I][sample(i, 3)]

Ответ 3

Другой альтернативный способ - использовать подход sapply.
Например:

  as.data.table(sapply(DT[], sample, 10))