Как вы извлекаете несколько случайных строк из таблицы 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?
Ответы
Ответ 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))