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?
Je viens de faire .N
travailler dans i
. Nouveau README item:
.N
est désormais disponible dansi
, 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
>
Il existe une approche en deux étapes:
i
en utilisant .I
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)]
Une autre alternative serait d'utiliser l'approche sapply
.
Par exemple:
as.data.table(sapply(DT[], sample, 10))