web-dev-qa-db-fra.com

Comment extraire quelques lignes aléatoires d'une table de données à la volée

J'ai une grande table de données (environ 24 000 lignes et en pleine croissance). Je veux sous-ensemble ce datatable basé sur un couple de critères et à partir de ce sous-ensemble (finit par être d'environ 3000 lignes), je veux échantillonner au hasard seulement 4 lignes. Je ne veux pas créer une table de données nommée de 3000 ou plus, compter ses lignes, puis échantillonner en fonction du numéro de ligne. Comment puis-je le faire à la volée? Ou devrais-je simplement le sucer en créant la table puis en travaillant dessus, en l'échantillonnant puis en utilisant rm() pour m'en débarrasser?

Permet de simuler mon problème

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

Cela fait une table de longueur aléatoire, qui simule le fait que selon mes critères et selon ma table de départ, je ne sais pas quelle est la longueur de la table sous-réglée

Maintenant, si je voulais juste les trois premières lignes, je pourrais le faire

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]

Mais disons que je ne voulais pas les trois premières lignes mais plutôt 3 lignes au hasard, alors je voudrais faire quelque chose comme ça ...

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 ]

Ça ne marchera pas. Comment calculer à la volée quelle était la longueur du data.frame initial?

27
Farrel

Je viens de faire .N travailler dans i. Nouveau README item:

.N est désormais disponible dans i, FR # 724 . Merci au débutant indirectement ici et Farrel directement ici .

Cela fonctionne maintenant:

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

par exemple.

> 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
> 
48
Matt Dowle

Il existe une approche en deux étapes:

  1. Calculez l'index i en utilisant .I
  2. Exemple sur l'index i

Exemple de code.

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
djhurio

Une autre alternative serait d'utiliser l'approche sapply.
Par exemple:

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