54 votes

Quand devrais-je utiliser setDT () au lieu de data.table () pour créer un fichier data.table?

J'ai de la difficulté à saisir l'essence de l' setDT() fonction. Comme je l'ai lu le code, et j'ai souvent rencontré l'utilisation de l' setDT() afin de créer une base de données.table. Bien entendu, l'utilisation de l' data.table() est omniprésent. J'ai l'impression d'solidement comprendre la nature de l' data.table() encore la pertinence de l' setDT() m'échappe. ?setDT me dit ceci:

setDT convertit les listes (tous deux nommés et sans nom) et de données.les trames de données.les tables par référence.

ainsi que:

En data.table le langage, tous set* fonctions de changer leur entrée par référence. C'est, aucune copie n'est faite à tous, autres que temporaires de la mémoire de travail, qui est grand comme une colonne.

Donc, cela me fait penser que je ne dois utiliser setDT() de faire un ensemble de données.le tableau à droite? Est - setDT() simplement d'une liste de données.table converter?

library(data.table)

a <- letters[c(19,20,1,3,11,15,22,5,18,6,12,15,23)]
b <- seq(1,41,pi)
ab <- data.frame(a,b)
d <- data.table(ab)
e <- setDT(ab)

str(d)
#Classes ‘data.table' and 'data.frame': 13 obs. of  2 variables:
# $ a: Factor w/ 12 levels "a","c","e","f",..: 9 10 1 2 5 7 11 3 8 4 ...
# $ b: num  1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>

str(e)
#Classes ‘data.table' and 'data.frame': 13 obs. of  2 variables:
# $ a: Factor w/ 12 levels "a","c","e","f",..: 9 10 1 2 5 7 11 3 8 4 ...
# $ b: num  1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>

Apparemment pas de différence dans ce cas. Dans un autre cas, la différence est évidente:

ba <- list(a,b)
f <- data.table(ba)
g <- setDT(ba)

str(f)
#Classes ‘data.table' and 'data.frame': 2 obs. of  1 variable:
# $ ba:List of 2
#  ..$ : chr  "s" "t" "a" "c" ...
#  ..$ : num  1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>

str(g)
#Classes ‘data.table' and 'data.frame': 13 obs. of  2 variables:
# $ V1: chr  "s" "t" "a" "c" ...
# $ V2: num  1 4.14 7.28 10.42 13.57 ...
# - attr(*, ".internal.selfref")=<externalptr>

Quand dois-je utiliser setDT()? Ce qui fait setDT() - il pertinent? Pourquoi ne pas simplement faire l'original, data.table() fonction capable de faire ce qu' setDT() est capable de faire?

48voto

Justin Points 1045

Mise à jour:

@Roland fait quelques bons points dans la section des commentaires, et le post est mieux pour eux. Alors que j'était à l'origine concentrée sur les problèmes de débordement de la mémoire, il a souligné que, même si cela ne se produit pas, la gestion de la mémoire de diverses copies prend beaucoup de temps, ce qui est plus courante de tous les jours préoccupation. Des exemples de ces deux questions ont été ajoutées.

J'aime cette question sur stackoverflow parce que je pense que c'est vraiment à éviter le débordement de pile dans R lorsque vous traitez avec de plus grands ensembles de données.

20voto

Nathan Werth Points 3469

setDT() n'est pas un remplacement pour l' data.table(). Il est plus efficace de remplacement pour as.data.table() qui peut être utilisé avec certains types d'objets.

  • mydata <- as.data.table(mydata) copie de l'objet derrière mydata, convertir le copier à un data.table, puis changer l' mydata symbole de point à la copie.
  • setDT(mydata) va changer l'objet derrière mydata d'un data.table. Pas de copie est terminé.

Donc, ce qui est une situation réaliste d'utiliser setDT()? Lorsque vous ne pouvez pas contrôler la classe de l'origine des données. Par exemple, la plupart des packages pour travailler avec des bases de données donnera data.frame de la production. Dans ce cas, votre code devrait être quelque chose comme

mydata <- dbGetQuery(conn, "SELECT * FROM mytable")  # Returns a data.frame
setDT(mydata)                                        # Make it a data.table

Quand devez-vous utiliser as.data.table(x)? Chaque fois qu' x n'est pas un list ou data.frame. L'utilisation la plus courante est pour les matrices.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X