web-dev-qa-db-fra.com

Supprimer les lignes conditionnellement d'un fichier data.table dans R

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.

35

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
47
Michele