Подмножество data.table с условием

Как отобрать подвыборку большой таблицы данных (пакет data.table)? Есть ли более элегантный способ выполнить следующее

DT<- data.table(cbind(site = rep(letters[1:2], 1000), value = runif(2000)))
DT[site=="a"][sample(1:nrow(DT[site=="a"]), 100)]

Думаю, есть простое решение, но не могу выбрать правильную формулировку для поиска.

ОБНОВЛЕНИЕ: В более общем смысле, как я могу получить доступ к номеру строки в аргументе i data.table без создания временного столбца для номера строки?


person RInatM    schedule 29.11.2013    source источник
comment
Нет необходимости использовать cbind в вашей команде data.table(.).   -  person Arun    schedule 29.11.2013


Ответы (2)


Одним из самых больших преимуществ использования data.table является то, что вы можете установить ключ для своих данных.
Используя key, а затем .I (встроенная переменная. См. ?data.table для получения дополнительной информации), вы можете использовать:

setkey(DT, site)
DT[DT["a", sample(.I, 100)]] 

Что касается вашего второго вопроса "how can I access a row number in data.table's i argument"

# Just use the number directly:
DT[17]
person Ricardo Saporta    schedule 29.11.2013
comment
Благодарность! просто для уточнения, как я могу попробовать каждое четное число, используя аргумент i? - person RInatM; 29.11.2013
comment
+1. С тем, что вы делаете, вам придется подмножество из внутреннего DT[..], то есть: DT[DT["a", sample(.I, 100)]$V1]. В качестве альтернативы вы можете использовать аргумент which в [.data.table следующим образом: DT[sample(DT["a", which=TRUE])] - person Arun; 29.11.2013

Используя which, вы можете найти номера строк. Вместо выборки из 1:nrow(...) вы можете просто выполнить выборку из всех строк с нужным свойством. В вашем примере вы можете использовать следующее:

DT[sample(which(site=="a"), 100)]
person shadow    schedule 29.11.2013