Recherche…


Introduction

Le package data.table a subi de nombreuses modifications et innovations au fil du temps. Voici quelques pièges potentiels qui peuvent aider les utilisateurs à consulter le code existant ou à consulter les anciens articles de blog.

unique et dupliqué ne fonctionne plus sur data.table à clé

Ceci est pour ceux qui passent à data.table> = 1.9.8

Vous avez un ensemble de données de propriétaires et de noms d'animaux, mais vous pensez que certaines données répétées ont été capturées.

library(data.table)
DT <- data.table(pet = c("dog","dog","cat","dog"),
                 owner = c("Alice","Bob","Charlie","Alice"),
                 entry.date = c("31/12/2015","31/12/2015","14/2/2016","14/2/2016"),
                 key = "owner")


> tables()
     NAME NROW NCOL MB COLS                 KEY  
[1,] DT      4    3  1 pet,owner,entry.date owner
Total: 1MB

Rappelez-vous de taper une table pour la trier. Alice a été entrée deux fois.

> DT
   pet   owner entry.date
1: dog   Alice 31/12/2015
2: dog   Alice  14/2/2016
3: dog     Bob 31/12/2015
4: cat Charlie  14/2/2016

Supposons que vous ayez utilisé unique méthode unique pour supprimer les doublons dans vos données en fonction de la clé, en utilisant la date de capture de données la plus récente en définissant fromLast to TRUE.

1.9.8
clean.DT <- unique(DT, fromLast = TRUE)

> tables()
    NAME     NROW NCOL MB COLS                 KEY  
[1,] clean.DT    3    3  1 pet,owner,entry.date owner
[2,] DT          4    3  1 pet,owner,entry.date owner
Total: 2MB

Alice en double a été supprimée.

1.9.8
clean.DT <- unique(DT, fromLast = TRUE)

> tables()
     NAME     NROW NCOL MB COLS                 KEY  
[1,] clean.DT    4    3  1 pet,owner,entry.date owner
[2,] DT          4    3  1 pet,owner,entry.date owner

Cela ne fonctionne pas. Encore 4 lignes!

Réparer

Utilisez le paramètre by= qui n'est plus par défaut pour votre clé mais pour toutes les colonnes.

clean.DT <- unique(DT, by = key(DT), fromLast = TRUE)

Maintenant tout va bien.

> clean.DT
   pet   owner entry.date
1: dog   Alice  14/2/2016
2: dog     Bob 31/12/2015
3: cat Charlie  14/2/2016

Détails et correction provisoire

Voir le point 1 des notes de version NEWS pour plus de détails:

Changements dans la v1.9.8 (sur CRAN 25 nov. 2016)

CHANGEMENT POTENTIEL DE CHANGEMENTS

  1. Par défaut, toutes les colonnes sont maintenant utilisées par les méthodes unique() , duplicated() et uniqueN() data.table, # 1284 et # 1841. Pour restaurer l'ancien comportement: options(datatable.old.unique.by.key=TRUE) . En 1 an, cette option de restauration de l'ancienne valeur par défaut sera déconseillée avec un avertissement. En 2 ans, l'option sera supprimée. Veuillez passer explicitement by=key(DT) pour plus de clarté. Seul le code qui repose sur la valeur par défaut est affecté. 266 modules CRAN et Bioconductor utilisant data.table ont été vérifiés avant la publication. 9 devaient changer et ont été notifiés. Toutes les lignes de code sans couverture de test auront été manquées par ces vérifications. Tous les paquets qui ne sont pas sur CRAN ou Bioconductor n'ont pas été vérifiés.

Vous pouvez donc utiliser les options comme solution temporaire jusqu'à ce que votre code soit corrigé.

options(datatable.old.unique.by.key=TRUE)


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow