【问题标题】:Apply a rolling function by group in r (zoo, data.table)在 r (zoo, data.table) 中按组应用滚动函数
【发布时间】:2017-08-23 17:47:50
【问题描述】:

我在做一些相当简单的事情时遇到了麻烦:在 data.table 中按组应用滚动函数(标准差)。 我的问题是,当我将 data.table 与某个列的 rollapply 一起使用时,data.table 会回收观察结果,如下面的警告消息中所述。我想获得窗口外观察结果的 NA,而不是回收标准差。

这是我目前使用虹膜的方法,以及一个大小为 2 的滚动窗口,向右对齐:

library(zoo)
library(data.table)

A <- iris
setDT(A)
A[,stdev := rollapply(Petal.Width, width = 2, sd, align = 'right', partial = F),by = Species]
Warning messages:
1: In `[.data.table`(A, , `:=`(stdeev, rollapply(Petal.Width, width = 2,  :
  Supplied 49 items to be assigned to group 1 of size 50 in column 'stdeev' (recycled leaving remainder of 1 items).
2: In `[.data.table`(A, , `:=`(stdeev, rollapply(Petal.Width, width = 2,  :
  Supplied 49 items to be assigned to group 2 of size 50 in column 'stdeev' (recycled leaving remainder of 1 items).
3: In `[.data.table`(A, , `:=`(stdeev, rollapply(Petal.Width, width = 2,  :
  Supplied 49 items to be assigned to group 3 of size 50 in column 'stdeev' (recycled leaving remainder of 1 items).

> A
     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species     stdeev      stdev
  1:          5.1         3.5          1.4         0.2    setosa 0.00000000 0.00000000
  2:          4.9         3.0          1.4         0.2    setosa 0.00000000 0.00000000
  3:          4.7         3.2          1.3         0.2    setosa 0.00000000 0.00000000
  4:          4.6         3.1          1.5         0.2    setosa 0.00000000 0.00000000
  5:          5.0         3.6          1.4         0.2    setosa 0.14142136 0.14142136
 ---                                                                                  
146:          6.7         3.0          5.2         2.3 virginica 0.28284271 0.28284271
147:          6.3         2.5          5.0         1.9 virginica 0.07071068 0.07071068
148:          6.5         3.0          5.2         2.0 virginica 0.21213203 0.21213203
149:          6.2         3.4          5.4         2.3 virginica 0.35355339 0.35355339
150:          5.9         3.0          5.1         1.8 virginica 0.42426407 0.42426407

【问题讨论】:

    标签: r data.table zoo


    【解决方案1】:

    fill=NA 添加到rollapply。这将确保返回一个长度为 50(而不是 49)的向量,其中 NA 作为第一个值(自 align="right" 起),避免回收。

    A[,stdev := rollapply(Petal.Width, width=2, sd, align='right', partial=F, fill=NA), by=Species]
    
        Sepal.Length Sepal.Width Petal.Length Petal.Width    Species      stdev
    1            5.1         3.5          1.4         0.2     setosa         NA
    2            4.9         3.0          1.4         0.2     setosa 0.00000000
    3            4.7         3.2          1.3         0.2     setosa 0.00000000
    ...
    51           7.0         3.2          4.7         1.4 versicolor         NA
    52           6.4         3.2          4.5         1.5 versicolor 0.07071068
    53           6.9         3.1          4.9         1.5 versicolor 0.00000000
    ...
    101          6.3         3.3          6.0         2.5  virginica         NA
    102          5.8         2.7          5.1         1.9  virginica 0.42426407
    103          7.1         3.0          5.9         2.1  virginica 0.14142136
    

    【讨论】:

    • 谢谢!对齐的真正作用是什么?我以为它是从左边开始计算窗口的,所以我预计在第一个值之前有两个 NA
    • 当您向右对齐时,它将第一个滚动值放置在窗口的右端,因此窗口长度为 2 将为第一个值提供 NA。左对齐将为最后一个值提供 NA。
    • 所以如果它是宽度 3,并且向右对齐,我会在第一个值之前看到两个 NA?
    • 是的。如果您使用中心,则开头会有一个 NA,最后会有一个。尝试将rollapply(1:20, sd, fill=NA) 设置为widthalign 的不同值,您将很快看到它是如何工作的。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2012-03-27
    • 2020-11-10
    相关资源
    最近更新 更多