首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对多个变量应用移动平均值/ rollapply

对多个变量应用移动平均值/ rollapply
EN

Stack Overflow用户
提问于 2022-04-29 14:04:43
回答 2查看 51关注 0票数 0

我在处理面板数据。我想将一些变量的3年和5年移动平均值添加到我的数据集中。我有下面的代码,它工作良好,但很长。是否有一种更整洁、更有效的方法来创建移动平均变量?

代码语言:javascript
复制
dataset <- dataset %>%  
  group_by(iso3c) %>% 
  dplyr::mutate(manu_GDP_3=rollapply(manu_GDP,3,mean,align='right',fill=NA), 
                manu_GDP_5=rollapply(manu_GDP,5,mean,align='right',fill=NA), 
                age_dep_3=rollapply(age_dep,3,mean,align='right',fill=NA), 
                age_dep_5=rollapply(age_dep,5,mean,align='right',fill=NA), 
                agr_GDP_3=rollapply(agr_GDP,3,mean,align='right',fill=NA), 
                agr_GDP_5=rollapply(agr_GDP,5,mean,align='right',fill=NA), 
                services_GDP_3=rollapply(services_GDP,3,mean,align='right',fill=NA), 
                services_GDP_5=rollapply(services_GDP,5,mean,align='right',fill=NA), 
                debtGNI_3=rollapply(debtGNI,3,mean,align='right',fill=NA),
                debtGNI_5=rollapply(debtGNI,5,mean,align='right',fill=NA),
                Foreign_liab_3=rollapply(Foreign_liab,3,mean,align='right',fill=NA),
                Foreign_liab_5=rollapply(Foreign_liab,5,mean,align='right',fill=NA),
                intcapimp_X_3=rollapply(intcapimp_X,3,mean,align='right',fill=NA),
                intcapimp_X_5=rollapply(intcapimp_X,5,mean,align='right',fill=NA),
                regime_3=rollapply(regime,3,mean,align='right',fill=NA),
                regime_5=rollapply(regime,5,mean,align='right',fill=NA),
                CBI2_3=rollapply(CBI2,3,mean,align='right',fill=NA),
                CBI2_5=rollapply(CBI2,5,mean,align='right',fill=NA),
                resource_rent_3=rollapply(resource_rent,3,mean,align='right',fill=NA),
                resource_rent_5=rollapply(resource_rent,5,mean,align='right',fill=NA),
                oil_rents_3=rollapply(oil_rents,3,mean,align='right',fill=NA),
                oil_rents_5=rollapply(oil_rents,5,mean,align='right',fill=NA),
                coal_rents_3=rollapply(coal_rents,3,mean,align='right',fill=NA),
                coal_rents_5=rollapply(coal_rents,5,mean,align='right',fill=NA))  %>% 
  ungroup()
EN

回答 2

Stack Overflow用户

发布于 2022-04-29 14:20:04

rollapply确实在多列上工作。例如,使用内置的mtcar,我们有以下内容。

代码语言:javascript
复制
library(zoo)

mtcars %>%
  select(1:5) %>%
  group_by(cyl) %>%
  transform(avg3 = rollmeanr(cbind(hp, disp), 3, fill = NA),
            avg5 = rollmeanr(cbind(hp, disp), 5, fill = NA)) %>%
  ungroup

给予:

代码语言:javascript
复制
    mpg cyl  disp  hp drat   avg3.hp avg3.disp avg5.hp avg5.disp
1  21.0   6 160.0 110 3.90        NA        NA      NA        NA
2  21.0   6 160.0 110 3.90        NA        NA      NA        NA
3  22.8   4 108.0  93 3.85 104.33333 142.66667      NA        NA
4  21.4   6 258.0 110 3.08 104.33333 175.33333      NA        NA
5  18.7   8 360.0 175 3.15 126.00000 242.00000   119.6    209.20
6  18.1   6 225.0 105 2.76 130.00000 281.00000   118.6    222.20
7  14.3   8 360.0 245 3.21 175.00000 315.00000   145.6    262.20
8  24.4   4 146.7  62 3.69 137.33333 243.90000   139.4    269.94
...etc...
票数 1
EN

Stack Overflow用户

发布于 2022-04-29 14:18:23

几件事:

  1. zoo::rollmean (以及它的*r右变体)比rollapply(., n, mean)更有效,我建议使用它。(编辑: G. Grothendieck说zoo::rollapply*会在有能力的时候使用rollmean,也许我在这里的评论已经过时或误导了。)

  1. across允许您在选定的列上迭代一个或多个函数。我使用across(Sepal.Length:Petal.Width,.)below, but it could easily be跨(c(Sepal.Length,Petal.Width,Sepal.Width),.)‘也一样容易。当给出一个函数列表时,命名约定似乎是直观的,请参见下面的结果。

代码语言:javascript
复制
iris %>%
  group_by(Species) %>%
  mutate(
    across(Sepal.Length:Petal.Width,
           list(mean3 = ~ zoo::rollmeanr(., 3, fill = NA),
                mean5 = ~ zoo::rollmeanr(., 5, fill = NA)) )
  ) %>%
  ungroup()
# # A tibble: 150 x 13
#    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_mean3 Sepal.Length_mean5 Sepal.Width_mean3 Sepal.Width_mean5 Petal.Length_mean3 Petal.Length_mean5 Petal.Width_mean3 Petal.Width_mean5
#           <dbl>       <dbl>        <dbl>       <dbl> <fct>                <dbl>              <dbl>             <dbl>             <dbl>              <dbl>              <dbl>             <dbl>             <dbl>
#  1          5.1         3.5          1.4         0.2 setosa               NA                 NA                NA                NA                 NA                 NA               NA                 NA   
#  2          4.9         3            1.4         0.2 setosa               NA                 NA                NA                NA                 NA                 NA               NA                 NA   
#  3          4.7         3.2          1.3         0.2 setosa                4.9               NA                 3.23             NA                  1.37              NA                0.2               NA   
#  4          4.6         3.1          1.5         0.2 setosa                4.73              NA                 3.1              NA                  1.4               NA                0.2               NA   
#  5          5           3.6          1.4         0.2 setosa                4.77               4.86              3.3               3.28               1.4                1.4              0.2                0.2 
#  6          5.4         3.9          1.7         0.4 setosa                5                  4.92              3.53              3.36               1.53               1.46             0.267              0.24
#  7          4.6         3.4          1.4         0.3 setosa                5                  4.86              3.63              3.44               1.5                1.46             0.3                0.26
#  8          5           3.4          1.5         0.2 setosa                5                  4.92              3.57              3.48               1.53               1.5              0.3                0.26
#  9          4.4         2.9          1.4         0.2 setosa                4.67               4.88              3.23              3.44               1.43               1.48             0.233              0.26
# 10          4.9         3.1          1.5         0.1 setosa                4.77               4.86              3.13              3.34               1.47               1.5              0.167              0.24
# # ... with 140 more rows

这意味着您的代码可能简化为以下内容(未经测试):

代码语言:javascript
复制
dataset %>%
  group_by(iso3c) %>%
  mutate(
    across(c(manu_GDP, age_dep, agr_GDP, services_GDP, debtGNI, Foreign_liab,
             intcapimp_X, regime, CBI2, resource_rent, oil_rents, coal_rents),
           list("3" = ~ zoo::rollmeanr(., 3, fill = NA),
                "5" = ~ zoo::rollmeanr(., 5, fill = NA)) )
  ) %>%
  ungroup()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72059213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档