2012-01-14 99 views
2

我在刪除xts對象中的重複行時遇到問題。我有一個R腳本,它將下載一個貨幣的點擊金融數據並將其轉換爲OHLC格式的xts對象。該腳本還會每15分鐘提取一次新數據。新數據從今天的第一筆交易下載到今天最後一筆交易。之前下載的舊數據以.Rdata格式存儲並調用。然後將新數據添加到舊數據中,並以.Rdata格式覆蓋舊數據。R語言:刪除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 

現在,如果我運行該腳本,我再次將新數據添加到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 

正如你所看到的最後一行是倒數第二行那一天。我想保留最後一個日期的最後一行並刪除倒數第二行。當我嘗試下面的代碼刪除重複的行時,它不起作用,重複的行留在那裏。

xx <- mt.xts[!duplicated(mt.xts$Index),] 
xx 
.Open .High .Low .Close .Volume .Adjusted 

我沒有得到任何結果。如何使用索引作爲重複指示刪除xts對象中的重複數據條目?

+0

也許你的意思是'!duplicated(mt.xts)'? – joran 2012-01-14 20:57:21

+0

我想我需要找到一種方法來刪除基於row.names,或使用.Open和.Adjusted作爲重複行的指標。使用指數將是最好的,因爲未來可能會有不同日期的公開和調整值相同。 – Kevin 2012-01-14 21:14:31

+0

@joran當我做xx =!重複(mt.xts)我只得到一個邏輯向量。在之前使用我之前所做的工作中,它似乎有效,但它們的對象不是xts。 – Kevin 2012-01-14 21:19:55

回答

10

不應該是index(mt.xts)而不是mt.xts$Index? 以下似乎工作。

# 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), ] 
+0

是一樣的,這基本上就是我所掌握的。 – joran 2012-01-14 22:41:12

+0

這消除了重複的行。唯一的問題是它會在最後刪除重複的行。當我添加新數據時,我希望它刪除以前的重複行。 – Kevin 2012-01-14 22:50:49

+0

我正在考慮使用lag(),如 apply(lag(x $ .Open,-1)== x $ .Open,1,all) – Kevin 2012-01-14 22:55:06