J'ai une data.table qui a deux clés: Année (10 niveaux) et MemberID (200 000 niveaux). Lorsque je mets la touche, est-ce que setkey(MemberID, Year)
donne des performances différentes par rapport à setkey(Year, MemberID)
? Si oui, quelle sera la meilleure façon?L'ordre des clés dans data.table est-il important?
Répondre
La performance et la vitesse du réglage de la touche dépendent des types de variables clés. numeric
colonnes sera plus lent que integer
. character
colonnes (lorsque les chaînes courtes) semblent être rapide.
par exemple
library(data.table)
set.seed(1)
DIC <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DIC2 <- copy(DIC)
DIF <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.factor(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DIF2 <- copy(DIF)
DNC <- data.table(year = sample(as.numeric(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DNC2 <- copy(DNC)
DCC <- data.table(year = sample(as.character(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DCC2 <- copy(DCC)
DII <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(seq_len(2e5), 5e6, TRUE), z = rnorm(5e6))
DII2 <- copy(DII)
Quelques timings
# key of integer, character columns
system.time(setkey(DIC, year ,id))
user system elapsed
3.21 0.11 3.31
system.time(setkey(DIC2, id, year))
user system elapsed
3.43 0.03 3.45
# key of integer factor columns
system.time(setkey(DIF, year ,id))
user system elapsed
6.31 0.05 6.37
system.time(setkey(DIF2, id, year))
user system elapsed
6.44 0.06 6.54
# key of numeric, character columns
system.time(setkey(DNC, year ,id))
user system elapsed
9.91 0.07 10.29
system.time(setkey(DNC2, id, year))
user system elapsed
10.11 0.07 10.34
# key of two character columns
system.time(setkey(DCC, year ,id))
user system elapsed
3.34 0.05 3.40
system.time(setkey(DCC2, id, year))
user system elapsed
3.40 0.02 3.42
# key of two integer columns
system.time(setkey(DII, year ,id))
user system elapsed
6.25 0.02 6.53
system.time(setkey(DII2, id,year))
user system elapsed
6.44 0.05 6.64
Quant à quelle manière sera mieux. Cela dépendra probablement de ce que vous êtes le plus susceptible de sous-estimer plus souvent seul.
Par exemple, vous devrez peut-être obtenir toutes les données pour l'année 1.
Si vous avez défini la clé comme year, id
vous pouvez utiliser
D[J(1)]
mais si la clé a été définie comme id, year
alors vous avez besoin
D[J(unique(id),1), nomatch = 0]
qui est plus dactylographie et prendra plus de temps car il doit calculer unique(id)
.
Il existe une demande de fonctionnalité FR#1007 qui cherche à autoriser une clé secondaire, mais elle n'est pas encore implémentée. Actuellement, il existe une seule clé qui peut occuper plus d'une colonne.
- 1. Choix des clés data.table dans R
- 2. data.table - clés de jointure NA
- 3. data.table « indices clés » ou « compteur de groupe »
- 4. R - en utilisant seulement quelques-unes des clés data.table
- 5. R - data.table par groupe par - l'ordre des clés et des clés manquantes
- 6. L'ordre des mots-clés statiques et volatils est-il important?
- 7. entiers traitent comme des valeurs clés plutôt que des index de ligne dans `data.table [I`
- 8. Pourquoi lapply() ne conserve pas mes clés data.table?
- 9. tabulation rowwise dans data.table
- 10. L'ordre des clés est-il important dans un document MongoDB BSON?
- 11. L'ordre des mots-clés dans la définition de variable est-il important?
- 12. na.omit dans data.table, R
- 13. data.table: Soustraction des niveaux signifie des valeurs
- 14. Temps de latence important important .CSV dans R avec en-tête dans la deuxième ligne
- 15. Recoder '[.data.table'
- 16. séquence .GRP inattendue dans data.table
- 17. multicore et data.table dans R
- 18. R dans Millisecondes strptime data.table
- 19. réduire des lignes dans 2 colonnes différentes dans data.table?
- 20. supprimer des lignes en utilisant R data.table
- 21. Utilisation des dates avec le package data.table
- 22. R data.table prix de conversion aux rendements des critères
- 23. Développement Android important dans Scala
- 24. data.table retourner plusieurs lignes
- 25. data.table redondance d'objet
- 26. important com.google.android.gcm.GCMRegistrar;
- 27. Comprendre .I dans data.table dans R
- 28. ! Important Overridden
- 29. Comment grouper par plusieurs colonnes dans data.table?
- 30. data.table :: fread and Unbalanced "
Merci beaucoup, mnel. – AdamNYC