Supprimer les lignes en double de l'objet xts
-
28-10-2019 - |
Question
Je rencontre des difficultés pour supprimer les lignes dupliquées dans un objet xts. J'ai un script R qui téléchargera les données financières des ticks d'une devise et les convertira en un objet xts au format OHLC. Le script extrait également de nouvelles données toutes les 15 minutes. Les nouvelles données sont téléchargées du premier commerce d'aujourd'hui au dernier commerce enregistré d'aujourd'hui. Les anciennes données téléchargées précédemment étaient stockées au format .Rdata et appelées. Ensuite, les nouvelles données sont ajoutées aux anciennes données et écrasent les anciennes données au format .Rdata.
Voici un exemple de ce à quoi mes données ressemblent:
.Open .High .Low .Close .Volume .Adjusted
2012-01-07 00:00:11 6.69683 7.01556 6.38000 6.81000 48387.58 6.81000
2012-01-08 00:00:09 6.78660 7.20000 6.73357 7.11358 57193.53 7.11358
2012-01-09 00:00:57 7.08362 7.19100 5.81000 6.32570 148406.85 6.32570
2012-01-10 00:01:01 6.32687 6.89000 6.00100 6.36000 110210.25 6.36000
2012-01-11 00:00:07 6.44904 7.13800 6.41266 6.90000 99442.07 6.90000
2012-01-12 00:01:02 6.90000 6.99700 6.33700 6.79999 140116.52 6.79999
2012-01-13 00:02:01 6.78211 6.80400 6.40000 6.41000 60228.77 6.41000
2012-01-14 00:00:23 6.42000 6.50000 6.23150 6.31894 25392.98 6.31894
Maintenant, si je lance à nouveau le script, j'ajouterai les nouvelles données aux xts.
.Open .High .Low .Close .Volume .Adjusted
2012-01-07 00:00:11 6.69683 7.01556 6.38000 6.81000 48387.58 6.81000
2012-01-08 00:00:09 6.78660 7.20000 6.73357 7.11358 57193.53 7.11358
2012-01-09 00:00:57 7.08362 7.19100 5.81000 6.32570 148406.85 6.32570
2012-01-10 00:01:01 6.32687 6.89000 6.00100 6.36000 110210.25 6.36000
2012-01-11 00:00:07 6.44904 7.13800 6.41266 6.90000 99442.07 6.90000
2012-01-12 00:01:02 6.90000 6.99700 6.33700 6.79999 140116.52 6.79999
2012-01-13 00:02:01 6.78211 6.80400 6.40000 6.41000 60228.77 6.41000
2012-01-14 00:00:23 6.42000 6.50000 6.23150 6.31894 25392.98 6.31894
2012-01-14 00:00:23 6.42000 6.75000 6.22010 6.57157 75952.01 6.57157
Comme vous pouvez le voir, la dernière ligne correspond au même jour que l'avant-dernière ligne. Je souhaite conserver la dernière ligne pour la dernière date et supprimer l'avant-dernière ligne. Lorsque j'essaye le code suivant pour supprimer les lignes dupliquées, cela ne fonctionne pas, les lignes dupliquées restent là.
xx <- mt.xts[!duplicated(mt.xts$Index),]
xx
.Open .High .Low .Close .Volume .Adjusted
Je n'obtiens aucun résultat. Comment puis-je supprimer des entrées de données en double dans un objet xts en utilisant l'index comme indicateur de duplication?
La solution
Ne devrait-il pas être index(mt.xts)
plutôt que mt.xts$Index
?
Ce qui suit semble fonctionner.
# Sample data
library(xts)
x <- xts(
1:10,
rep( seq.Date( Sys.Date(), by="day", length=5 ), each=2 )
)
# Remove rows with a duplicated timestamp
y <- x[ ! duplicated( index(x) ), ]
# Remove rows with a duplicated timestamp, but keep the latest one
z <- x[ ! duplicated( index(x), fromLast = TRUE ), ]
Autres conseils
Dans mon cas,
x <- x[! duplicated( index(x) ),]
n'a pas fonctionné comme prévu, car le système rend en quelque sorte la date-heure unique dans chaque ligne.
x <- x[! duplicated( coredata(x) ),]
Cela peut fonctionner si la solution précédente n'a pas aidé.