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?
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.