web-dev-qa-db-fra.com

Insérer une ligne dans un data.table

Si j'ai un cadre de données

set.seed(12345) 
df=data.frame(a=rnorm(5),b=rnorm(5))

Je peux ajouter une ligne, par exemple.

df[6,] =c(5,6)

Si je fais maintenant l'équivalent dans data.table

library(data.table)
dt=data.table(df)
dt[6,]=c(5,6)

Il échoue avec une erreur. Quelle est la bonne façon d'insérer une ligne dans un fichier data.table?

41
Tahnoon Pasha

Pour développer la réponse @Franks, si dans votre cas particulier vous ajoutez une ligne, c'est:

set.seed(12345) 
dt1 <- data.table(a=rnorm(5), b=rnorm(5))

Les éléments suivants sont équivalents. Je trouve le premier plus facile à lire mais le second plus rapide:

microbenchmark(
  rbind(dt1, list(5, 6)),
  rbindlist(list(dt1, list(5, 6)))        
  )

Comme on peut le voir:

                             expr     min      lq  median       uq     max
           rbind(dt1, list(5, 6)) 160.516 166.058 175.089 185.1470 457.735
 rbindlist(list(dt1, list(5, 6))) 130.137 134.037 140.605 149.6365 184.326

Si vous voulez insérer la ligne ailleurs, voici ce qui fonctionnera, mais ce n'est pas joli:

rbindlist(list(dt1[1:3, ], list(5, 6), dt1[4:5, ]))

ou même

rbindlist(list(dt1[1:3, ], as.list(c(5, 6)), dt1[4:5, ]))

donnant:

            a          b
1:  0.5855288 -1.8179560
2:  0.7094660  0.6300986
3: -0.1093033 -0.2761841
4:  5.0000000  6.0000000
5: -0.4534972 -0.2841597
6:  0.6058875 -0.9193220

Si vous modifiez une ligne à la place (ce qui est l'approche recommandée), vous devrez définir au préalable la taille du fichier data.table, c'est-à-dire.

dt1 <- data.table(a=rnorm(6), b=rnorm(6))
set(dt1, i=6L, j="a", value=5) # refer to column by name
set(dt1, i=6L, j=2L, value=6) # refer to column by number

Merci @Boxuan, j'ai modifié cette réponse pour prendre en compte votre suggestion, qui est un peu plus rapide et plus facile à lire.

45
dardisco