gpt4 book ai didi

r - 是否有类似 rollapply for data.frame 的功能

转载 作者:行者123 更新时间:2023-12-04 07:40:42 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
Can `ddply` (or similar) do a sliding window?



是否有像 rollapply(标准 R 或 CRAN 包内)这样的函数在 data.frame 上运行,但不会将其转换为矩阵。 rollapply 可以与 data.frame 一起使用,但如果 data.frame 具有混合类型,则每个数据窗口都将转换为字符(矩阵)。

我更喜欢支持宽度,na.pad,对齐等的功能,就像r​​ollapply

示例

使用混合类型的任何 data.frame
test = data.frame( Name = c( "bob" , "jane" , "joe" ) , Points = c( 4 , 9 , 1 ) )
假设您想以窗口大小 2 滚动。 FUN 的第一次迭代使用仅包含测试的第 1 行和第 2 行的 data.frame 调用。

所以 RollapplyThatRespectsDataFrame( ... , FUN = function( x ) { ... } )在第一次迭代时将设置 x = data.frame( Name = c( "bob" , "jane" ) , Points = c( 4 , 9 ) )
第二次迭代是一个 data.frame 的第 2 行和第 3 行 test .

基本上这个新函数与 rollapply 做同样的事情,除了它与 data.frames 一起正常工作。它不会转换为矩阵。

最佳答案

尝试这个:

> library(zoo)
> DF <- data.frame(a = 1:10, b = 21:30, c = letters[1:10])
> replace(DF, 1:2, rollapply(DF[1:2], 3, sum, fill = NA))
a b c
1 NA NA a
2 6 66 b
3 9 69 c
4 12 72 d
5 15 75 e
6 18 78 f
7 21 81 g
8 24 84 h
9 27 87 i
10 NA NA j

关于经过一些讨论后添加到问题中的示例,此类功能可以在 rollapply 之上分层。通过将其应用于行索引:
> lapply(as.data.frame(t(rollapply(1:nrow(test), 2, c))), function(ix)test[ix, ])
$V1
Name Points
1 bob 4
2 jane 9

$V2
Name Points
2 jane 9
3 joe 1

在这里总结得更好一点:
rollapply.data.frame <- function(data, ..., fill = NULL, FUN, 
simplify = function(x) do.call(rbind, x)) {
fill0 <- if (!is.null(fill)) NA
result <- lapply(
as.data.frame(t(rollapply(1:nrow(data), ..., fill = fill0, FUN = c))),
function(ix) {if (all(is.na(ix))) fill else FUN(data[ix, ])}
)
simplify(result)
}

> rollapply(test, 2, FUN = identity, simplify = identity)
$V1
Name Points
a bob 4
b jane 9

$V2
Name Points
b jane 9
c joe 1

> rollapply(test, 2, FUN = identity, fill = NA, simplify = identity)
$V1
Name Points
a bob 4
b jane 9

$V2
Name Points
b jane 9
c joe 1

$V3
[1] NA

关于r - 是否有类似 rollapply for data.frame 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13771385/

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