J'ai un data.table avec des champs {id, menuitem, amount}.
Il s’agit de données de transaction - les identifiants sont uniques, mais menuitem se répète. Maintenant, je veux supprimer toutes les entrées où menuitem == 'coffee'
.
En outre, vous souhaitez supprimer toutes les lignes où amount <= 0
;
Quelle est la bonne façon de faire cela dans data.table?
Je peux utiliser data$menuitem!='coffee'
puis indexer int dans data [] - mais cela n’est pas nécessairement efficace et ne tire pas parti de data.table.
Tous les indicateurs dans la bonne direction sont appréciés.
Dans ce scénario, il n’est pas si différent de data.frame
data <- data[ menuitem != 'coffee' | amount > 0]
Supprimer/ajouter ligne par référence, il doit être implémenté. Vous trouvez plus d'infos dans cette question
En ce qui concerne la vitesse:
1 Vous pouvez bénéficier de clés en faisant quelque chose comme:
setkey(data, menuitem)
data <- data[!"coffee"]
qui sera plus rapide que data <- data[ menuitem != 'coffee']
. Cependant, pour appliquer les mêmes filtres que ceux que vous avez posés dans la question, vous aurez besoin d'une jointure progressive (j'ai terminé ma pause déjeuner et je peux ajouter quelque chose plus tard :-)).
2 Même sans clé, data.table est beaucoup plus rapide pour une table relativement grande (vitesse similaire pour une poignée de lignes)
dt<-data.table(id=sample(letters,1000000,T),var=rnorm(1000000))
df<-data.frame(id=sample(letters,1000000,T),var=rnorm(1000000))
library(microbenchmark)
> microbenchmark(dt[ id == "a"], df[ df$id == "a",])
Unit: milliseconds
expr min lq median uq max neval
dt[id == "a"] 24.42193 25.74296 26.00996 26.35778 27.36355 100
df[df$id == "a", ] 138.17500 146.46729 147.38646 149.06766 154.10051 100