用于删除重复行的 rbind xts 对象的方法
Method to rbind xts objects that removes duplicate rows
xts
对象目前是否有任何方法可以按名称绑定列并保留第一个对象的所有行或第二个对象的行?
我可以 rbind 数据,然后删除重复的索引条目,但我相信默认情况下会在重复时保留第一个对象的行。
我不相信有 xts
方法可以做到这一点,但我们仍然可以让它发挥作用,至少有几种方法。
如果您查看 ?rbind.xts
,您会看到:
Identical indexed series are bound in the order or the arguments passed to 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()
,我们将按照我们提供的 d1
和 d2
的顺序获得重复值。然后我们可以使用 duplicated()
找到重复项,并否定 (!
) 该索引以去除 select 它们。
dat.bind <- rbind(d1, d2)
dat.bind.d1 <- dat.bind[!duplicated(time(dat.bind))]
到select另一组重复值,我们可以切换rbind()
中参数的顺序,或者我们可以将我们用duplicated()
创建的布尔向量移动一个左边,因此 deselect 两个相同值的第一个而不是第二个。
dat.bind.d2 <- dat.bind[c(!duplicated(time(dat.bind))[-1], TRUE)]
这种方法有一个警告,那就是 d1
和 d2
不能单独有重复的索引。如果我们使用 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])
xts
对象目前是否有任何方法可以按名称绑定列并保留第一个对象的所有行或第二个对象的行?
我可以 rbind 数据,然后删除重复的索引条目,但我相信默认情况下会在重复时保留第一个对象的行。
我不相信有 xts
方法可以做到这一点,但我们仍然可以让它发挥作用,至少有几种方法。
如果您查看 ?rbind.xts
,您会看到:
Identical indexed series are bound in the order or the arguments passed to 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()
,我们将按照我们提供的 d1
和 d2
的顺序获得重复值。然后我们可以使用 duplicated()
找到重复项,并否定 (!
) 该索引以去除 select 它们。
dat.bind <- rbind(d1, d2)
dat.bind.d1 <- dat.bind[!duplicated(time(dat.bind))]
到select另一组重复值,我们可以切换rbind()
中参数的顺序,或者我们可以将我们用duplicated()
创建的布尔向量移动一个左边,因此 deselect 两个相同值的第一个而不是第二个。
dat.bind.d2 <- dat.bind[c(!duplicated(time(dat.bind))[-1], TRUE)]
这种方法有一个警告,那就是 d1
和 d2
不能单独有重复的索引。如果我们使用 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])