【问题标题】:Grouping data by date range R按日期范围分组数据 R
【发布时间】:2021-02-18 02:18:36
【问题描述】:

我的数据框包含 1983-2008 年以下格式的数据:

Year, temp,
1983, .109,
1984, .091,
1985, -.10,
1986, .051,
1987, -.071,
1988, .101,
1989, .003,
1990, -.051,
1991, -.110,
1992, .134,
1993, .091,
1994, .122,
1995, .101,
1996, .087,
1997, .075,

有没有办法在散点图中绘制这些数据,以便每个图都是 5 年框架的平均值。例如,第一个图的 x 值是 1983-1987 年,y 值是那些年的平均温度。我查看了以均值作为第三个参数的聚合函数,但此函数不支持日期范围。

【问题讨论】:

  • 您好,我注意到您到目前为止已经提出了 24 个问题,但没有接受任何问题。请考虑从每个问题(包括这个)中接受一个最适合您的情况的答案。每个帖子您只能接受一个答案,但可以随心所欲地投票。参考stackoverflow.com/help/someone-answers

标签: r dataframe scatter-plot


【解决方案1】:

我们可以使用zoorollmean 函数计算滚动平均值并使用ggplot2 进行绘图。

library(dplyr)
library(ggplot2)

df %>%
  mutate(temp_rolling_avg = zoo::rollmean(temp, 5, align = 'left', fill = NA), 
         Year_label = paste(Year, lead(Year, 4), sep = '-')) %>%
  filter(!is.na(temp_rolling_avg)) %>%
  ggplot(aes(Year_label, temp_rolling_avg)) + 
  geom_col()

【讨论】:

    【解决方案2】:

    您可以使用embedrowMeans

    x = 1985 : 1995
    y = rowMeans(embed(df$temp,5))
    plot(x, y)
    

    【讨论】:

      【解决方案3】:

      使用滚动平均函数。这是一个基础 R 解决方案:

      vec 是您的对象,len 是窗口大小,prtl 打印部分平均值。

      rollmean <- function(vec, len, prtl = FALSE) {
        if (len > length(vec)) {
           stop(paste("Choose lower range,", len, ">", length(vec)))
         }
         else {
           if (prtl == T) {
             sapply(1:length(vec), function(i) {
               if (i <= len) {
                 mean(vec[1:i])
               }
               else {
                 mean(vec[(i - (len - 1)):i])
               }
             })
           }
           else {
             sapply(1:length(vec), function(i) {
               if (i - (len - 1) > 0) {
                 mean(vec[(i - (len - 1)):i])
               }
               else {
                 NA
               }
             })
           }
         }
       }              
      

      要获取数据,请像这样使用它:

      dat
         Year   temp
      1  1983  0.109
      2  1984  0.091
      3  1985 -0.100
      ...
      
      mydat <- setNames( data.frame( paste( rollmean(dat$Year,5) - 2, 
                 rollmean(dat$Year,5) + 2, sep="-" ),
                 rollmean(dat$temp,5) ), colnames(dat) )
      
      mydat
              Year    temp
      1      NA-NA      NA
      2      NA-NA      NA
      3      NA-NA      NA
      4      NA-NA      NA
      5  1983-1987  0.0160
      6  1984-1988  0.0144
      7  1985-1989 -0.0032
      8  1986-1990  0.0066
      9  1987-1991 -0.0256
      10 1988-1992  0.0154
      11 1989-1993  0.0134
      12 1990-1994  0.0372
      13 1991-1995  0.0676
      14 1992-1996  0.1070
      15 1993-1997  0.0952
      

      绘制数据,例如作为条形图(使用geom_point( aes( Year, temp )) 作为散点图):

      require(ggplot2)
      ggplot( mydat ) + geom_bar( aes( Year, temp, fill=Year ), stat="identity" ) +
          theme(axis.text = element_text(size = 6))
      

      简单地使用mydat[!is.na(mydat[,2]),]省略NAs

      【讨论】:

        猜你喜欢
        • 2013-11-04
        • 2021-11-16
        • 2021-03-05
        • 2020-11-09
        • 2018-03-13
        • 2013-05-19
        • 2010-10-31
        相关资源
        最近更新 更多