2014-07-10 19 views
20

Ho un grande data.table (circa 24000 righe e in crescita). Voglio suddividere quello datatable sulla base di un paio di criteri e da quel sottoinsieme (finisce per essere circa 3000 righe) Voglio campionare a caso solo 4 righe. Non voglio creare un nome di circa 3000 righe data.table, contare le sue righe e quindi campionare in base al numero di riga. Come posso farlo al volo? O dovrei semplicemente succhiarlo creando il tavolo e poi lavorandoci sopra, campionandolo e poi usando rm() per sbarazzartene?Come estrarre alcune righe casuali da un data.table al volo

Lets simulare il mio problema

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)) 

che fa un tavolo a correre, che simula il fatto che a seconda dei miei criteri e in base alla mia tavola di partenza, non so quale sia la lunghezza del tavolo subsetted con essere

Ora, se volevo solo le prime tre file ho potuto fare come in modo

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] 

ma diciamo che non volevo le prime tre righe, ma piuttosto un 3 righe casuali, quindi vorrei fare qualcosa come questo ...

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 ] 

Che non funzionerà. Come faccio a calcolare, al volo, quale era la lunghezza del data.frame iniziale?

risposta

36

appena fatto .N lavoro in i. Nuova voce README:

.N è ora disponibile in i, FR#724. Grazie a newbie indirettamente here e Farrel direttamente here.

Questo funziona ora:

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

esempio

> 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

Darn, maledettamente bene. Grazie. È proprio quello che volevo. Mi sono reso conto che dovevo installare l'ultima versione di GitHub. Ho avuto problemi con 'pdflatex non è disponibile '. Ho letto da qualche parte sull'argomento build_vignettes = F e tutto ha funzionato bene dopo. 'install_github (" data.table "," Rdatatable ", build_vignettes = F)' – Farrel

3

C'è un approccio in due fasi:

  1. calcolare l'indice i utilizzando .I
  2. Esempio sull'indice i

codice di esempio.

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)] 
1

Un altro modo alternativo sarebbe utilizzare l'approccio sapply.
Per esempio:

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