Pour se débarrasser d'une colonne nommée "foo" dans un data.frame
, je peux faire:
df <- df[-grep('foo', colnames(df))]
Cependant, une fois df
converti en data.table
objet, il n'y a aucun moyen de supprimer simplement une colonne.
Exemple:
df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))]
Mais une fois converti en data.table
objet, cela ne fonctionne plus.
r
data.table
Maiasaura
la source
la source
dt
au lieu dedf3
...Réponses:
L'un des éléments suivants supprimera la colonne
foo
du tableau de donnéesdf3
:data.table prend également en charge la syntaxe suivante:
mais si vous vouliez réellement supprimer la colonne
"foo"
dedf3
(au lieu d'imprimer simplement une vue de ladf3
colonne moins"foo"
), vous voudriez vraiment utiliser la méthode 1 à la place.(Notez que si vous utilisez une méthode reposant sur
grep()
ougrepl()
, vous devez définirpattern="^foo$"
plutôt que"foo"
, si vous ne voulez pas que les colonnes avec des noms comme"fool"
et"buffoon"
(c'est-à-dire celles contenantfoo
comme sous-chaîne) soient également mises en correspondance et supprimées.)Options moins sûres, bien pour une utilisation interactive:
Les deux idiomes suivants fonctionneront également - s'ils
df3
contiennent une correspondance de colonne"foo"
- mais échoueront d'une manière probablement inattendue si ce n'est pas le cas. Si, par exemple, vous utilisez l'un d'eux pour rechercher la colonne inexistante"bar"
, vous vous retrouverez avec un data.table à zéro ligne.En conséquence, ils sont vraiment les mieux adaptés à une utilisation interactive où l'on peut, par exemple, vouloir afficher une table de données moins toutes les colonnes avec des noms contenant la sous-chaîne
"foo"
. À des fins de programmation (ou si vous souhaitez réellement supprimer les colonnesdf3
plutôt que d'en copier), les méthodes 1, 2a et 2b sont vraiment les meilleures options.Enfin, certaines approches sont utilisées
with=FALSE
, maisdata.table
s'éloignent progressivement de cet argument, il est donc déconseillé de les éviter; montrant ici afin que vous sachiez que l'option existe au cas où vous en auriez vraiment besoin:la source
-grep
versus!grepl
.grepl()
début et cela n'a pas fonctionné, car les colonnes data.table ne peuvent pas être indexées par un vecteur logique. Mais je me rends compte maintenant que celagrepl()
peut être fait fonctionner en l'enveloppant avecwhich()
, de sorte qu'il retourne un vecteur entier.data.table
, mais l'envelopperwhich
est intelligent!data.table
plus; ajouté FR # 1797 . Mais, la méthode 1 est (presque) infiniment plus rapide que les autres. La méthode 1 supprime la colonne par référence sans aucune copie. Je doute que vous l'obteniez au-dessus de 0,005 secondes pour n'importe quelle taille data.table. En revanche, les autres peuvent ne pas fonctionner du tout si la table est proche de 50% de RAM car ils copient tout sauf celui à supprimer.Vous pouvez également utiliser
set
pour cela, ce qui évite la surcharge des[.data.table
boucles in:Si vous voulez le faire par nom de colonne,
which(colnames(dt) %in% c("a","c","e"))
devrait fonctionner pourj
.la source
data.table
1.11.8, si vous voulez le faire par nom de colonne, vous pouvez le faire directementrm.col = c("a","b")
etdt[, (rm.col):=NULL]
Je le fais simplement dans le cadre de données:
Fonctionne rapidement et autant que je puisse voir ne pose aucun problème.
MISE À JOUR: pas la meilleure méthode si votre DT est très grand, car l'utilisation de l'
$<-
opérateur entraînera la copie d'objet. Donc mieux utiliser:la source
Option très simple dans le cas où vous avez plusieurs colonnes individuelles à supprimer dans un tableau de données et que vous souhaitez éviter de taper tous les noms de colonnes #careadviced
Cela supprimera à la place les colonnes basées sur le numéro de colonne.
Ce n'est évidemment pas aussi efficace car il contourne les avantages de data.table mais si vous travaillez avec moins de 500 000 lignes, cela fonctionne bien
la source
Supposons que votre dt comporte des colonnes
col1
,col2
,col3
,col4
,col5
,coln
.Pour en supprimer un sous-ensemble:
la source
Voici un moyen lorsque vous souhaitez définir un nombre de colonnes sur NULL, étant donné que leurs noms de colonne ont une fonction pour votre usage :)
la source
la source
Pour un data.table, l'attribution de la colonne à NULL la supprime:
... ce qui équivaut à:
L'équivalent pour un data.frame est:
Q. Pourquoi y a-t-il une virgule dans la version de data.table et aucune virgule dans la version de data.frame?
A. Comme les data.frames sont stockés sous forme de liste de colonnes, vous pouvez ignorer la virgule. Vous pouvez également l' ajouter dans, mais vous devrez les affecter à une liste de
NULL
s,DF[, c("col1", "col2", "col3")] <- list(NULL)
.la source
data.frames
où la ligne et les colonnes seraient commutées. Ce serait illogique.DF[column,row]
donc je voulais juste voir s'il y avait effectivement des cas où cela s'était produit.