【问题标题】:Calculating a Rolling Average with Missing Time Values计算缺少时间值的滚动平均值
【发布时间】:2018-03-01 18:36:15
【问题描述】:

我有一个如下描述的数据集:

> dput(droplevels(head(sample,10)))
structure(list(Team = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = "Air-Force", class = "factor"), Year = c(2003L, 
2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2011L, 2012L, 2013L
), Grouped_Position_3 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = "Skill", class = "factor"), Avg_Rating = c(0.7667, 
0, 0.7444, 0.7222, 0, 0.7556, 0.76224, 0.596322222222222, 0.706584615384615, 
0.767509090909091), n = c(1L, 1L, 3L, 6L, 1L, 1L, 5L, 9L, 13L, 
11L)), .Names = c("Team", "Year", "Grouped_Position_3", "Avg_Rating", 
"n"), row.names = c(NA, 10L), class = "data.frame")

在完整的数据集中,有多个学校、分组的职位和年份。我正在尝试做的是弄清楚如何使用当前年份和过去四年为每个独特的学校,年份和职位组生成滚动平均值。例如,对于 2013 年,空军和技能职位我希望进行以下计算(请注意,数据中缺少 2010 年):

(.767+.70+.59+0+.762)/5

0 来自缺失的年份。我已经结合 dplyr 查看了 zoo 库,但我无法控制这样的缺失值。我是在考虑必须编写一个循环还是 r 中有一些具有此功能的包?

【问题讨论】:

    标签: r for-loop dplyr calculated-columns zoo


    【解决方案1】:

    创建一个函数Avg,它给定一个行号向量ix,取最近5年所需的平均值,然后rollapplyr它用于TeamGrouped_Position_3的每组:

    library(zoo)
    
    Avg <- function(ix) with(sample[ix, ], sum(Avg_Rating[Year >= max(Year) - 4]) / 5)
    transform(sample, Avg = ave(1:nrow(sample), Team, Grouped_Position_3, FUN = 
       function(ix) rollapplyr(ix, 5, Avg, partial = TRUE)))
    

    给予:

            Team Year Grouped_Position_3 Avg_Rating  n       Avg
    1  Air-Force 2003              Skill  0.7667000  1 0.1533400
    2  Air-Force 2004              Skill  0.0000000  1 0.1533400
    3  Air-Force 2005              Skill  0.7444000  3 0.3022200
    4  Air-Force 2006              Skill  0.7222000  6 0.4466600
    5  Air-Force 2007              Skill  0.0000000  1 0.4466600
    6  Air-Force 2008              Skill  0.7556000  1 0.4444400
    7  Air-Force 2009              Skill  0.7622400  5 0.5968880
    8  Air-Force 2011              Skill  0.5963222  9 0.4228324
    9  Air-Force 2012              Skill  0.7065846 13 0.5641494
    10 Air-Force 2013              Skill  0.7675091 11 0.5665312
    

    注意

    使用的输入是:

    sample <- structure(list(Team = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L), .Label = "Air-Force", class = "factor"), Year = c(2003L, 
    2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2011L, 2012L, 2013L
    ), Grouped_Position_3 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L), .Label = "Skill", class = "factor"), Avg_Rating = c(0.7667, 
    0, 0.7444, 0.7222, 0, 0.7556, 0.76224, 0.596322222222222, 0.706584615384615, 
    0.767509090909091), n = c(1L, 1L, 3L, 6L, 1L, 1L, 5L, 9L, 13L, 
    11L)), .Names = c("Team", "Year", "Grouped_Position_3", "Avg_Rating", 
    "n"), row.names = c(NA, 10L), class = "data.frame")
    

    【讨论】:

    • 所以当我尝试运行这个函数时(就像只运行代码以使其成为可调用函数)我得到一个错误。我注意到它确实在我的 R 工作室窗格中显示为可用功能,这是一个问题吗?下面的错误。 as.data.frame.default(x[[i]], optional = TRUE) 中的错误:无法将类“function”强制转换为 data.frame
    • 如果您将代码复制并粘贴到注释中,然后粘贴到答案正文中,它不会给出错误消息。您一定做了其他事情,但除非您提供可重现的示例,否则我们无法知道您做了什么。
    猜你喜欢
    • 2021-10-14
    • 2021-06-04
    • 1970-01-01
    • 2020-03-28
    • 2016-04-05
    • 2022-01-09
    • 2019-11-24
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多