gpt4 book ai didi

r - 应用生成 data.frames 列表(或单个 rbinded data.frame)的滚动功能

转载 作者:行者123 更新时间:2023-12-04 03:25:41 24 4
gpt4 key购买 nike

滚动函数最常用的两个函数(据我所知)是 zoo::rollapplydata.table::frollapply()

但是,两者似乎都无法运行为每个步骤生成 data.frame 的函数,然后将它们返回到列表中或作为单个 rbind-ed data.frame。

作为一个简单的例子,如果我有一个函数只返回一个简单的 data.frame 并且我用滚动函数调用它,我希望得到:

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 获得的所有 data.frames 整理成一个 rbind-ed数据.框架。)

这对于 zoodata.table 来说似乎是不可能的:

zoo 似乎不允许列表作为 zoo 对象,这阻碍了它们用作输入或输出。如果该函数返回裸数据帧,则输出似乎对各个数据帧的转置版本执行 rbind(另外,输出是矩阵,而不是数据帧,这是 Not Acceptable )。

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 循环手动执行此操作,但怀疑可能有更好、更像 R 的解决方案。

最佳答案

1) 对索引运行rollapply,然后使用apply

library(zoo)

f <- function(x) data.frame(a = LETTERS[x], b = x)
ii <- rollapply(1:3, 2, c)
apply(ii, 1, f)

给予:

[[1]]
a b
1 A 1
2 B 2

[[2]]
a b
1 B 2
2 C 3

2) 这也有效:

L <- list()
junk <- rollapply(1:3, 2, function(x, i = x[1]) L[[i]] <<- f(x))
L

给予:

[[1]]
a b
1 A 1
2 B 2

[[2]]
a b
1 B 2
2 C 3

3)另一种方法是在语言上进行计算。

s <- rollapply(1:3, 2, function(x) sprintf("f(c(%s))", toString(x)))
lapply(s, function(x) eval(parse(text = x)))

给予:

[[1]]
a b
1 A 1
2 B 2

[[2]]
a b
1 B 2
2 C 3

关于r - 应用生成 data.frames 列表(或单个 rbinded data.frame)的滚动功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67629898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com