rbind xts对象删除重复行的方法

时间:2018-07-26 14:59:46

标签: r merge time-series xts rbind

当前是否有用于xts对象的方法来按名称对列进行查找并保留第一个对象的所有行或第二个对象的行?

我可以先查找数据,然后删除重复的索引条目,但是我相信默认情况下,重复时将保留第一个对象的行。

1 个答案:

答案 0 :(得分:3)

我不相信有一种xts方法,但是我们仍然可以通过至少两种方式使它起作用。
如果您查看?rbind.xts,将会看到以下内容:

  

相同的索引序列按传递给rbind的顺序或参数绑定。

我们可以利用它来发挥优势。

首先是一些示例数据

library(xts)

structure(c(5, 4, 2, 2, 4, 3, 3, 5), class = c("xts", "zoo"), .indexCLASS
= "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC", index =
structure(c(949449600, 949536000, 949708800, 949795200, 949881600,
949968000, 950054400, 950227200), tzone = "UTC", tclass = "Date"), .Dim =
c(8L, 1L)) -> d1

structure(c(3, 3, 3, 4, 2, 3, 3, 5), class = c("xts", "zoo"), .indexCLASS
= "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC", index =
structure(c(948931200, 949104000, 949190400, 949449600, 949536000,
949622400, 949708800, 950054400), tzone = "UTC", tclass = "Date"), .Dim =
c(8L, 1L)) -> d2

如果我们随后进行rbind(),则将按照提供的d1d2的顺序获得重复的值。然后,我们可以使用duplicated()查找重复项,并取反(!)索引以取消选择它们。

dat.bind <- rbind(d1, d2)

dat.bind.d1 <- dat.bind[!duplicated(time(dat.bind))]

要选择另一组重复的值,我们可以切换rbind()中参数的顺序,也可以将用duplicated()创建的布尔矢量向左移动,从而取消选择两个相同值的第一个而不是第二个。

dat.bind.d2 <- dat.bind[c(!duplicated(time(dat.bind))[-1], TRUE)]

此方法有一个警告,那就是d1d2不能分别有重复的索引。如果我们使用merge()则没有此限制。

我们进行外部联接(包括所有值,并根据需要填写NA个)。然后,我们可以简单地将一列中的NA替换为另一列中相同索引的值。

dat.merged <- merge(d1, d2, join="outer")

dat.merged.d1 <- replace(dat.merged[, 1], 
                         is.na(dat.merged[, 1]), 
                         dat.merged[is.na(dat.merged[, 1]), 2])

dat.merged.d2 <- replace(dat.merged[, 2], 
                         is.na(dat.merged[, 2]), 
                         dat.merged[is.na(dat.merged[, 2]), 1])