R数据帧变量之间的移动平均值

R数据帧变量之间的移动平均值,r,variables,moving-average,R,Variables,Moving Average,我正试图找到解决办法,但还没有。 我的数据框架结构如下: country City 2014 2015 2016 2017 2018 2019 France Paris 23 34 54 12 23 21 US NYC 1 2 2 12 95 54 我想找出每3年(即2014-16年、2015-17年等)的移动平均值,并将其放在特别列中 country City 2014 2015 2016 2017 2018 2019 201

我正试图找到解决办法,但还没有。 我的数据框架结构如下:

country City 2014 2015 2016 2017 2018 2019
France  Paris 23   34   54   12   23   21
US       NYC   1    2    2    12   95  54 

我想找出每3年(即2014-16年、2015-17年等)的移动平均值,并将其放在特别列中

country City 2014 2015 2016 2017 2018 2019 2014-2016  2015-2017  2016-2018  2017-2019
France  Paris 23   34   54   12   23   21    37          33.3      29.7        18.7  
US       NYC   1    2    2    12   95  54    etc           etc     etc          etc

有什么提示吗?

1使用末尾注释中重复显示的数据,我们将rollmean应用于数据转置中的每一列,然后再转置回去。我们应用适当的粘贴命令来创建名称

library(zoo)

DF2 <- DF[-(1:2)]
cbind(DF, setNames(as.data.frame(t(rollmean(t(DF2), 3))), 
  rollapply(names(DF2), 3, function(x) paste(range(x), collapse = "-"))))
2这也可以用dplyr/tidyr/zoo表示,如下所示:

library(dplyr)
library(tidyr)
library(zoo)

DF %>%
  pivot_longer(-c(country, City)) %>%
  group_by(country, City) %>%
  mutate(value = rollmean(value, 3, fill = NA),
    name = rollapply(name, 3, function(x) paste(range(x), collapse="-"), fill=NA)) %>%
  ungroup %>%
  drop_na %>%
  pivot_wider %>%
  left_join(DF, ., by = c("country", "City"))
笔记 1使用末尾注释中重复显示的数据,我们将rollmean应用于数据转置中的每一列,然后再转置回。我们应用适当的粘贴命令来创建名称

library(zoo)

DF2 <- DF[-(1:2)]
cbind(DF, setNames(as.data.frame(t(rollmean(t(DF2), 3))), 
  rollapply(names(DF2), 3, function(x) paste(range(x), collapse = "-"))))
2这也可以用dplyr/tidyr/zoo表示,如下所示:

library(dplyr)
library(tidyr)
library(zoo)

DF %>%
  pivot_longer(-c(country, City)) %>%
  group_by(country, City) %>%
  mutate(value = rollmean(value, 3, fill = NA),
    name = rollapply(name, 3, function(x) paste(range(x), collapse="-"), fill=NA)) %>%
  ungroup %>%
  drop_na %>%
  pivot_wider %>%
  left_join(DF, ., by = c("country", "City"))
笔记
非常感谢你的帮助。你能解释一下这是怎么回事吗?我以后会避免用愚蠢的问题来打扰社区…非常感谢你的解释。另一个问题:第一个解决方案只考虑那些3年来都有数据的国家。有没有可能把只有一两个数字的年份也包括在内,平均数是1年或2年呢?@G.格罗森迪克:你是说这样的吗cbindext\u pov,setNamesas.data.frametrollapplytext\u pov\u 4,3,FUN=mean,partial=TRUE,rollapplynamesext\u pov\u 4,3,FUN=mean,partial=TRUE,functionx pasterangex,collapse=-`@G.Grothendieck:理论上你是对的,不过我甚至试图标记1个数据,在为每个国家考虑的三年期方案中包括2个或3个,但这是另一个问题。无论如何,脚本仍然没有考虑包括1个或更多NAs的三年期。非常感谢您的帮助。你能解释一下这是怎么回事吗?我以后会避免用愚蠢的问题来打扰社区…非常感谢你的解释。另一个问题:第一个解决方案只考虑那些3年来都有数据的国家。有没有可能把只有一两个数字的年份也包括在内,平均数是1年或2年呢?@G.格罗森迪克:你是说这样的吗cbindext\u pov,setNamesas.data.frametrollapplytext\u pov\u 4,3,FUN=mean,partial=TRUE,rollapplynamesext\u pov\u 4,3,FUN=mean,partial=TRUE,functionx pasterangex,collapse=-`@G.Grothendieck:理论上你是对的,不过我甚至试图标记1个数据,在为每个国家考虑的三年期方案中包括2个或3个,但这是另一个问题。无论如何,脚本仍然没有考虑三年期,包括1个或更多NAs。