从xts对象中删除重复的行

4
我在处理一个xts对象时遇到了删除重复行的问题。我有一个R脚本,可以下载货币的tick金融数据并将其转换为OHLC格式的xts对象。该脚本还会每15分钟拉取新数据。新数据是从今天的第一笔交易到今天最后一笔记录的交易下载的。之前下载的旧数据以.Rdata格式存储并被调用。然后将新数据添加到旧数据中,并覆盖.Rdata格式的旧数据。
以下是我的数据示例:
                      .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对象中删除重复数据条目?


也许你的意思是 !duplicated(mt.xts) - joran
我在考虑需要找到一种基于行名称删除的方法,或者同时使用 .Open 和 .Adjusted 作为重复行的指标。使用索引可能是最好的选择,因为将来可能会出现不同日期的 Open 和 Adjusted 值相同的情况。 - Kevin
@joran 当我执行xx = !duplicated(mt.xts)时,我只得到一个逻辑向量。在之前的使用中,我做过类似的操作,但它们的对象不是xts。 - Kevin
抱歉,我不知道自己在想什么。我不能使用.Adjusted来确定重复行。由于这是货币数据,它与.Close相同。 - Kevin
2个回答

15

应该使用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 ),  ]

是的,基本上这就是我想表达的意思。 - joran
这将消除重复的行。唯一的问题是它会删除最后一个重复的行。由于我正在添加新数据,我希望它删除先前重复的行。 - Kevin
我在考虑使用lag()函数,例如: apply(lag(x$.Open,-1)==x$.Open,1,all) - Kevin
“duplicated”有一个“fromLast”参数,可以实现这个功能:我已经相应地编辑了答案。 - Vincent Zoonekynd
你是对的Vincent,它运行得很好,x[!duplicated(index(x), fromLast=TRUE)] - Kevin

2
在我的情况下,最初的回答是:
x <- x[! duplicated( index(x) ),]

最初的回答并没有按预期工作,因为系统在每行中以某种方式使日期时间唯一。

x <- x[! duplicated( coredata(x) ),]

最初的回答没有帮助的话,这个方法可能有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接