两个最常用的滚动函数(据我所知)分别是
然而,两者都似乎无法运行生成数据框每步的函数,并将它们作为列表或单个
以一个微不足道的例子为例,如果我有一个函数,它仅返回一个微不足道的数据框,并在滚动函数中调用它,我期望得到:
(如果您感兴趣的话,我的真正用例是通过一个日期向量(或必要时使用列表),然后调用一个外部API来返回表格数据。由于API的限制,我不能一次性完成所有任务,并且必须多次调用API以获取所需内容。我的最终目标是将从API获取的所有数据框整合到一个单独的数据框中。)
(这似乎在zoo和data.table上不可能实现:)
(zoo似乎不允许将列表作为zoo对象,这妨碍了它们作为输入或输出的使用。如果函数返回一个裸数据框,输出似乎会rbind转置版本的各个数据框(此外,输出是一个矩阵,而不是数据框,这是不可接受的)。)
使用
zoo :: rollapply
和 data.table :: frollapply()
。然而,两者都似乎无法运行生成数据框每步的函数,并将它们作为列表或单个
rbind
数据帧返回。以一个微不足道的例子为例,如果我有一个函数,它仅返回一个微不足道的数据框,并在滚动函数中调用它,我期望得到:
f <- function(x) {
data.frame(a = LETTERS[x], b = x)
}
# will be called twice, with inputs 1:2 and 2:3.
myrollapply(1:3, n = 2, FUN = f)
#> [[1]]
#> a b
#> 1 A 1
#> 2 B 2
#>
#> [[2]]
#> a b
#> 1 B 2
#> 2 C 3
#>
#> -- OR --
#>
#> a b
#> 1 A 1
#> 2 B 2
#> 3 B 2
#> 4 C 3
(如果您感兴趣的话,我的真正用例是通过一个日期向量(或必要时使用列表),然后调用一个外部API来返回表格数据。由于API的限制,我不能一次性完成所有任务,并且必须多次调用API以获取所需内容。我的最终目标是将从API获取的所有数据框整合到一个单独的数据框中。)
(这似乎在zoo和data.table上不可能实现:)
(zoo似乎不允许将列表作为zoo对象,这妨碍了它们作为输入或输出的使用。如果函数返回一个裸数据框,输出似乎会rbind转置版本的各个数据框(此外,输出是一个矩阵,而不是数据框,这是不可接受的)。)
zoo::rollapply(c(1, 2, 3),
width = 2,
FUN = function(x) {data.frame(a = 1:3)})
#> a1 a2 a3
#> [1,] 1 2 3
#> [2,] 1 2 3
zoo::rollapply(data.frame(a = c(1, 2, 3)),
width = 2,
FUN = function(x) {data.frame(a = 1:3)})
#> a
#> [1,] 1
#> [2,] 1
#> [3,] 2
#> [4,] 2
#> [5,] 3
#> [6,] 3
zoo::rollapply(c(1, 2, 3),
width = 2,
FUN = function(x) {list(data.frame(a = 1:3))})
#> Error in zoo(do.call("c", dat), index(data)[ix], attr(data, "frequency")) :
#> “x” : attempt to define invalid zoo object
zoo::rollapply(list(1, 2, 3),
width = 2,
FUN = function(x) {data.frame(a = 1:3)})
#> Error in zoo(data) : “x” : attempt to define invalid zoo object
使用
data.table::frollapply
,问题更容易理解:返回值必须是数字(或可转换为数字)。data.table::frollapply(c(1, 2, 3), n = 2, FUN = function(x) {data.frame(a = 1:3)})
#> Error in data.table::frollapply(c(1, 2, 3), n = 2, FUN = function(x) { :
#> frollapply: results from provided FUN are not of type double
是否有一个包或方法可以处理这个特定的情况? 我目前正在使用for-loop手动处理,但怀疑可能有更好的、更像R的解决方案。