为什么 rbindXts 的 dup 参数没有暴露?
Why is rbindXts's dup parameter not exposed?
我想要rbind
一堆xts对象,应该不重叠,但如果它们重叠我不希望它添加一行两次: 任选其一。 (我目前做 duplicated(index(x))
,然后删除它们。)
(显示问题的示例代码和所需的输出如下)。
四处寻找,我发现 C source 有一个 dup
参数;它默认为 FALSE
,当我将其设置为 TRUE
时,我得到了我想要的行为:
.External("rbindXts", dup = T, x,y,z, PACKAGE = "xts")
没有在 rbind()
界面中公开它是否有充分的理由? ("good" 的原因我的意思是它被认为是错误的,或者在大数据上的性能非常糟糕,或者类似的东西。)或者更实际的原因,比如没有人有时间为它编写测试和文档了吗?
更新:
我回到我的代码,发现我实际上并没有使用 rbind.xts
,而是此处描述的 do.call.rbind()
函数: 由于 rbind.xts 中的内存问题。
(我还发现了我自己的(!)三年前的问题,它描述了我如何删除重复项:How to remove a row from zoo/xts object, given a timestamp)
更新#2:
do.call.rbind
可以修改为使用 External
调用:
do.call.rbind.xts.no_dup <- function(lst) {
while(length(lst) > 1) {
idxlst <- seq(from=1, to=length(lst), by=2)
lst <- lapply(idxlst, function(i) {
if(i==length(lst)) { return(lst[[i]]) }
return(.External("rbindXts", dup = T, lst[[i]], lst[[i+1]], PACKAGE = "xts"))
})
}
lst[[1]]
}
我用此处显示的相同测试数据对此进行了测试:,它具有相同的性能,并生成相同的 280 万行 xts 对象,如 do.call.rbind
(很好) .当然,那个测试数据没有重复,所以可能不是一个公平的测试?
x <- xts(1:10, Sys.Date()+1:10)
y <- xts(50:55,Sys.Date() + (-1:-6))
z <- xts(20:25,Sys.Date() + (-2:+3))
rbind(x,y,z)
这给出了以下输出(*** 显示不需要的行)
2015-07-02 55
2015-07-03 54
2015-07-04 53
2015-07-05 52
2015-07-06 51
2015-07-06 20 ***
2015-07-07 50
2015-07-07 21 ***
2015-07-08 22
2015-07-09 1
2015-07-09 23 ***
2015-07-10 2
2015-07-10 24 ***
2015-07-11 3
2015-07-11 25 ***
2015-07-12 4
2015-07-13 5
2015-07-14 6
2015-07-15 7
2015-07-16 8
2015-07-17 9
2015-07-18 10
而 .External("rbindXts", dup = T, x,y,z, PACKAGE = "xts")
给出:
2015-07-02 55
2015-07-03 54
2015-07-04 53
2015-07-05 52
2015-07-06 51
2015-07-07 50
2015-07-08 22
2015-07-09 1
2015-07-10 2
2015-07-11 3
2015-07-12 4
2015-07-13 5
2015-07-14 6
2015-07-15 7
2015-07-16 8
2015-07-17 9
2015-07-18 10
看着 the commit where it was added,它似乎是实验性的。因此出于实际原因它没有公开:它是 untested/undocumented.
我想要rbind
一堆xts对象,应该不重叠,但如果它们重叠我不希望它添加一行两次: 任选其一。 (我目前做 duplicated(index(x))
,然后删除它们。)
(显示问题的示例代码和所需的输出如下)。
四处寻找,我发现 C source 有一个 dup
参数;它默认为 FALSE
,当我将其设置为 TRUE
时,我得到了我想要的行为:
.External("rbindXts", dup = T, x,y,z, PACKAGE = "xts")
没有在 rbind()
界面中公开它是否有充分的理由? ("good" 的原因我的意思是它被认为是错误的,或者在大数据上的性能非常糟糕,或者类似的东西。)或者更实际的原因,比如没有人有时间为它编写测试和文档了吗?
更新:
我回到我的代码,发现我实际上并没有使用 rbind.xts
,而是此处描述的 do.call.rbind()
函数: 由于 rbind.xts 中的内存问题。
(我还发现了我自己的(!)三年前的问题,它描述了我如何删除重复项:How to remove a row from zoo/xts object, given a timestamp)
更新#2:
do.call.rbind
可以修改为使用 External
调用:
do.call.rbind.xts.no_dup <- function(lst) {
while(length(lst) > 1) {
idxlst <- seq(from=1, to=length(lst), by=2)
lst <- lapply(idxlst, function(i) {
if(i==length(lst)) { return(lst[[i]]) }
return(.External("rbindXts", dup = T, lst[[i]], lst[[i+1]], PACKAGE = "xts"))
})
}
lst[[1]]
}
我用此处显示的相同测试数据对此进行了测试:,它具有相同的性能,并生成相同的 280 万行 xts 对象,如 do.call.rbind
(很好) .当然,那个测试数据没有重复,所以可能不是一个公平的测试?
x <- xts(1:10, Sys.Date()+1:10)
y <- xts(50:55,Sys.Date() + (-1:-6))
z <- xts(20:25,Sys.Date() + (-2:+3))
rbind(x,y,z)
这给出了以下输出(*** 显示不需要的行)
2015-07-02 55
2015-07-03 54
2015-07-04 53
2015-07-05 52
2015-07-06 51
2015-07-06 20 ***
2015-07-07 50
2015-07-07 21 ***
2015-07-08 22
2015-07-09 1
2015-07-09 23 ***
2015-07-10 2
2015-07-10 24 ***
2015-07-11 3
2015-07-11 25 ***
2015-07-12 4
2015-07-13 5
2015-07-14 6
2015-07-15 7
2015-07-16 8
2015-07-17 9
2015-07-18 10
而 .External("rbindXts", dup = T, x,y,z, PACKAGE = "xts")
给出:
2015-07-02 55
2015-07-03 54
2015-07-04 53
2015-07-05 52
2015-07-06 51
2015-07-07 50
2015-07-08 22
2015-07-09 1
2015-07-10 2
2015-07-11 3
2015-07-12 4
2015-07-13 5
2015-07-14 6
2015-07-15 7
2015-07-16 8
2015-07-17 9
2015-07-18 10
看着 the commit where it was added,它似乎是实验性的。因此出于实际原因它没有公开:它是 untested/undocumented.