79 votes

ce que vous pouvez faire avec les données.cadre de que vous ne pouvez pas dans les données.table

J'ai juste commencé à l'aide de R, et est venu à travers les données.table. Je l'ai trouvé génial.

Une question très naïve: puis-je ignorer les données.cadre d'utilisation des données.table pour éviter la syntaxe de la confusion entre deux paquets?

69voto

Amanda Points 967

À partir des données.tableau FAQ

FAQ 1.8 OK, je commence à voir quelles sont les données.le tableau est sur, mais pourquoi n'avez-vous pas améliorer les données.cadre en R? Pourquoi a-t-il d'être un nouveau paquet?

Comme FAQ 1.1 faits marquants, j en [.data.table est fondamentalement différent de j en [.data.frame. Même quelque chose d'aussi simple que de DF[,1] de casser le code existant dans de nombreux packages et le code de l'utilisateur. C'est par la conception, et nous voulons travailler de cette façon-pour plus d' syntaxe compliquée à travailler. Il y a d'autres différences, trop (voir la FAQ 2.17).

En outre, data.table hérite data.frame. C'est un data.frame, trop. Un data.table peut être transmis à un paquet seulement accepte data.frame et que ce paquet peut utiliser [.data.frame syntaxe sur l' data.table.

Nous avons proposé des améliorations à R dans la mesure du possible, trop. L'un des de ces a été accepté comme une nouvelle fonctionnalité dans la R version 2.12.0 :

unique() et match() sont maintenant plus rapide sur le caractère des vecteurs où tous les éléments sont dans le global CHARSXP cache et ont banalisé le codage ASCII). Merci à Matthieu Dowle pour suggérer des améliorations à la façon dont le code de hachage est généré en unique.c.

Une deuxième proposition a été d'utiliser des memcpy en duplicate.c, ce qui est beaucoup plus rapide qu'une boucle for dans C. de Cette façon serait d'améliorer la façon de R copies données en interne (sur certaines mesures par 13 fois). Le fil sur la r-devel c'est ici : http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html.

2.17 Quelles sont les plus petites différences de syntaxe entre les données.cadre et données.de la table?

  • DT[3] se réfère à la 3e rangée, mais DF[3] fait référence à la colonne 3
  • DT[3,] == DT[3], mais DF[,3] == DF[3] (un peu prêter à confusion)
  • Pour cette raison, nous disons que la virgule est facultative dans DT, mais pas en option dans le DF
  • DT[[3]] == DF[3] == DF[[3]]
  • DT[i,] où i est un entier retourne une seule ligne, comme DF[i,], mais à la différence d'une matrice ligne unique qui retourne un sous-ensemble vecteur.
  • DT[,j,with=FALSE] où j est un entier retourne une colonne de données.tableau, contrairement à DF[,j] qui renvoie un vecteur par défaut
  • DT[,"colA",with=FALSE][[1]] == DF[,"colA"].
  • DT[,colA] == DF[,"colA"]
  • DT[,list(colA)] == DF[,"colA",drop=FALSE]
  • DT[NA] retourne 1 rangée de NA, mais DF[NA] renvoie une copie de DF contenant NA tout au long de.
  • Le symbole NA est de type logique dans R, et est donc recyclé en [.data.frame. L'Intention wasprobably DF[NA_integer_]. [.data.table le fait automatiquement pour des raisons de commodité.
  • DT[c(TRUE,NA,FALSE)] traite le NA comme FAUX, mais DF[c(TRUE,NA,FALSE)] retours NA les lignes
    pour chaque NA
  • DT[ColA==ColB] est plus simple que d' DF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]
  • data.frame(list(1:2,"k",1:4)) crée 3 colonnes, data.table crée une colonne de la liste.
  • check.names est par défaut TRUE en data.frame mais FALSE en data.table, pour plus de commodité.
  • stringsAsFactors est par défaut à TRUE en data.frame mais FAUX en data.table, pour plus d'efficacité.
  • Depuis une chaîne globale de cache a été ajouté à R, les personnages sont les éléments pointeur de la seule mise en cache de la chaîne et il n'est plus un avantage de performance de coverting à la factor.
  • Atomique vecteurs dans les colonnes de la liste s'est effondré lors de l'impression à l'aide de ", " dans les données.cadre, mais "," dans les données.table avec une virgule après le 6ème point pour éviter les blessures accidentelles de l'impression des gros objets incorporés.
  • En [.data.frame nous avons très souvent ensemble drop=FALSE. Lorsque l'oublions pas, des bugs peuvent survenir dans les cas limites où les colonnes sont sélectionnées et tous les d'un coup, un vecteur est retourné plutôt que d'une seule colonne les données.cadre. En [.data.table nous avons profité de l'occasion pour faire cohérente et goutte goutte.
  • Quand un ensemble de données.le tableau est transmis à un ensemble de données.le tableau n'est pas au courant de paquet, paquet, il ne concerne pas l'un de ces différences; il fonctionne, tout simplement

Petite mise en garde

Il y aura probablement des cas où certains paquets, utilisez le code qui tombe lors d'une de données.image, cependant, étant donné qu' data.table est constamment maintenue pour éviter de tels problèmes, les problèmes qui peuvent survenir sera corrigé rapidement.

Par exemple

  • base: unname(DT) fonctionne à nouveau, en tant que de besoin par plyr::faire fondre(). Grâce à Christoph Jaeckel pour les rapports. Test ajouté.
  • Une comme.les données.cadre de la méthode a été ajoutée pour ITime, de sorte que ITime peut être passé à ggplot2 sans erreur, #1713. Grâce à Farrel Buchinsky pour les rapports. Tests ajouté. ITime les étiquettes de l'axe sont toujours affichés en tant que nombre entier de secondes depuis minuit; nous ne savons pas pourquoi ggplot2 ne pas invoquer ITime est comme.caractère de la méthode. Convertir ITime à POSIXct pour ggplot2, est une approche.

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