data.table
Pourquoi mon ancien code ne fonctionne pas?
Recherche…
Introduction
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.
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.
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
- Par défaut, toutes les colonnes sont maintenant utilisées par les méthodes
unique()
,duplicated()
etuniqueN()
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 explicitementby=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)