【问题标题】:Moving Averages in Data frame by factor variable with non-leading NA's and entire factor levels as NA's in R数据帧中的移动平均值按因子变量,非领先 NA 和整个因子水平作为 R 中的 NA
【发布时间】:2014-09-04 14:48:53
【问题描述】:

关于如何通过因子变量计算数据框中的移动平均值,我还没有找到令人满意的答案。另外,我的问题是整个因子水平是 NA(没有一个国家或个人的数据)和非领先 NA 的情况(缺少最后一次观察)。

考虑:

value <- c(rep(NA,4),1,2,3,NA,5:8)
factor <- c(rep("a",4), rep("b",4),rep("c",4))
Data <- as.data.frame(cbind(value,factor))    

我想要 3 个观察值的(右对齐)移动平均值。对这些软件包感到抱歉,但在我看来,这应该与 ddply 函数一起使用:

library(TTR) # for moving averages
library(plyr) # for ddply
Data <- ddply(Data,"factor",MAvalue = SMA(value, n=3)) 

结果应该是这样的:

value    factor    MAvalue
NA       a         NA
NA       a         NA
NA       a         NA
NA       a         NA # this factor has no data
1        b         NA
2        b         NA
3        b         2
NA       b         NA # this factor is missing the last observation
5        c         NA
6        c         NA
7        c         6
8        c         7 # this factor has complete information

任何帮助将不胜感激!

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    使用 NA 数据:

    library(zoo)
    library(data.table)
    
    setDT(Data)
    Data[, MA.value := rollmeanr(value, 3, na.pad = TRUE), by = factor]
    

    【讨论】:

    • 谢谢!这适用于所有因素都是 NA 的情况。但是,它不适用于具有非领先 NA 的情况。有解决办法吗?
    • 我更新了关于 NA 问题的问题,并将在我们解决问题后删除我的 cmets :-)
    【解决方案2】:

    当使用cbind 时,它将所有数据转换为字符。试试这个。

    value <- c(1:12)
    factor <- c(rep("a",6), rep("b",6))
    Data <- data.frame(factor = factor,
                          value = value)
    
    ddply(Data, .(factor), transform, MAValue = SMA(value, 3))
    
       factor value MAValue
    1       a     1      NA
    2       a     2      NA
    3       a     3       2
    4       a     4       3
    5       a     5       4
    6       a     6       5
    7       b     7      NA
    8       b     8      NA
    9       b     9       8
    10      b    10       9
    11      b    11      10
    12      b    12      11
    

    【讨论】:

    • 谢谢!到目前为止有效。我如何处理一个因素水平完全不适用?现在返回一个错误。例如,将 'value' 替换为: value
    • 我意识到我的大部分问题都来自 NA。这段代码似乎对非领先的 NA(它不明白它可以在最后一个 obs 丢失时更早停止一个 obs)和所有 NA 的因子级别(它应该只返回为 NA)都有问题)。你介意我按照这些思路更新我的问题吗?之后我们可以删除我们的 cmets
    • 结合Henk上面做的,但不使用data.tables,试试library(zoo);ddply(Data, .(factor), transform, rollmean(value,3))
    • 您可以/应该还指定您想要的移动平均线类型。有关选项 [center, left, right],请参见 ?rollmean。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多