Ma question porte sur l'attribution par référence par rapport à la copie data.table
. Je veux savoir si on peut supprimer des lignes par référence, similaire à
DT[ , someCol := NULL]
Je veux savoir
DT[someRow := NULL, ]
Je suppose qu'il y a une bonne raison pour laquelle cette fonction n'existe pas, alors peut-être pourriez-vous simplement indiquer une bonne alternative à l'approche de copie habituelle, comme ci-dessous. En particulier, en allant avec mon exemple préféré (data.table),
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
Dites que je veux supprimer la première ligne de cette table data.table. Je sais que je peux le faire:
DT <- DT[-1, ]
mais souvent, nous voulons éviter cela, car nous copions l'objet (et cela nécessite environ 3 * N de mémoire, si N object.size(DT)
, comme indiqué ici . Maintenant, j'ai trouvé set(DT, i, j, value)
. Je sais comment définir des valeurs spécifiques (comme ici: définir tout valeurs des lignes 1 et 2 et des colonnes 2 et 3 à zéro)
set(DT, 1:2, 2:3, 0)
DT
# x y v
# [1,] a 0 0
# [2,] a 0 0
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
Mais comment puis-je effacer les deux premières lignes, par exemple? Faire
set(DT, 1:2, 1:3, NULL)
définit le DT entier sur NULL.
Mes connaissances SQL sont très limitées, alors vous me dites: donnée data.table utilise la technologie SQL, y a-t-il un équivalent à la commande SQL
DELETE FROM table_name
WHERE some_column=some_value
dans data.table?
DT[ , keep := .I > 1]
, puis un sous-ensemble pour des opérations ultérieures :, DT[(keep), ...]
peut-être même setindex(DT, keep)
la vitesse de ce sous-ensemble. Ce n'est pas une panacée, mais cela vaut la peine d'être considéré comme un choix de conception dans votre flux de travail - voulez-vous vraiment supprimer toutes ces lignes de la mémoire ou préférez-vous les exclure? La réponse diffère selon le cas d'utilisation.
data.table()
utilise autant la technologie SQL que l'on puisse établir un parallèle entre les différentes opérations en SQL et les différents arguments d'undata.table
. Pour moi, la référence à la «technologie» implique quelque part qu'elle sedata.table
trouve quelque part au-dessus d'une base de données SQL, ce qui n'est pas le cas d'AFAIK.