【问题标题】:R datatable create the average value over the five previous yearsR 数据表创建前五年的平均值
【发布时间】:2021-03-07 04:03:00
【问题描述】:

我有一个变量的数据,我想获得前 5 年同一个月同一变量的当前水平与平均值之间的差异。

library(tidyverse)
library(data.table)
library(lubridate)
MWE <- as.data.table(ggplot2::economics) %>%
  .[,c("pce","psavert","uempmed","unemploy"):=NULL]

> MWE
           date      pop
  1: 1967-07-01 198712.0
  2: 1967-08-01 198911.0
  3: 1967-09-01 199113.0
  4: 1967-10-01 199311.0
  5: 1967-11-01 199498.0
 ---                    
570: 2014-12-01 319746.2
571: 2015-01-01 319928.6
572: 2015-02-01 320074.5
573: 2015-03-01 320230.8
574: 2015-04-01 320402.3

我可以按月完成,但我无法将对当前行的引用纳入到类似year(date) &lt; year(currentline) &amp; year(date) &gt;= year(currentline)-6 的操作中

MWE_2 <- MWE[,MeanPastYears:=mean(pop),by=month(date)]

我想要的输出是

       date      pop      avg_5yrs
  1: 1967-07-01 198712.0     NA
  2: 1967-08-01 198911.0     NA
  3: 1967-09-01 199113.0     NA
  4: 1967-10-01 199311.0     NA
  5: 1967-11-01 199498.0     NA
 ---                    
570: 2014-12-01 319746.2   313013.8
571: 2015-01-01 319928.6   313192.1
572: 2015-02-01 320074.5   313350.7
573: 2015-03-01 320230.8   313511.2
574: 2015-04-01 320402.3   313640.3

【问题讨论】:

  • 试试data.table::frollmean
  • 你能提供一些玩具数据/预期结果
  • @CatalystRPA 我做了
  • 但是你想要的输出不是错了吗?如果您检查 2010 年 4 月、2011 年 4 月、...到 2014 年 4 月,平均值为 313640 而不是 311834...
  • 嗯,我是通过 Excel 完成的,但过了一年。我纠正它

标签: r date data.table data-manipulation lubridate


【解决方案1】:

[ 中的列可以作为向量进行索引,因此我们首先为 year(date) &lt; year(date[..I]) &amp; year(date) &gt;= year(date[..I]) - 6 的每一行创建一个向量,当日期在区间内时,该向量为 true,然后按月份获取 pop 的平均值:

df[,
    year:=year(date)
][, 
    avg_5yrs := sapply(1:.N, function(..I) mean(pop[year < year[..I] & year >= year[..I] -6])), by=month(date)
][, year:=NULL][]
            date      pop avg_5yrs
  1: 1967-07-01 198712.0      NaN
  2: 1967-08-01 198911.0      NaN
  3: 1967-09-01 199113.0      NaN
  4: 1967-10-01 199311.0      NaN
  5: 1967-11-01 199498.0      NaN
 ---                             
570: 2014-12-01 319746.2 311845.5
571: 2015-01-01 319928.6 312028.1
572: 2015-02-01 320074.5 312192.6
573: 2015-03-01 320230.8 312357.4
574: 2015-04-01 320402.3 312498.1

【讨论】:

  • 现在它没有月份方面(我只想比较同月的价值,例如因为某些月份有更多的死亡/出生)。但这似乎很有希望,我需要一些时间来了解它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2018-06-02
  • 2011-06-24
  • 1970-01-01
  • 2016-05-26
  • 2020-10-22
  • 2023-04-07
相关资源
最近更新 更多