首页 文章

将每日数据平均为每周数据

提问于
浏览
3

我想知道是否有办法将每日数据平均为每周数据 . 我称之为CADaily的数据框如下所示:

> CADaily[1:10, ]
          Climate_Division       Date      Rain
      885                1 1948-07-01 0.8750000
      892                1 1948-07-02 2.9166667
      894                1 1948-07-03 0.7916667
      895                1 1948-07-04 0.4305556
      898                1 1948-07-05 0.8262061
      901                1 1948-07-06 0.5972222
      904                1 1948-07-17 0.04166667
      905                1 1948-07-18 0.08333333
      907                1 1948-07-20 0.04166667
      909                1 1948-07-22 0.12500000
      910                1 1948-07-21 NA

我的目标类似于根据日期(当然)和Climate_Division(范围从1到7)找到每日降雨量的平均值的总函数 . 我在网上搜索,我遇到了一个我能够使用的代码,但与我的目标并不相符:

apply.weekly(xts(CADaily[,-2], order.by= CADaily[,2]), FUN = mean)

这就是我希望它做的事情,但是我的专栏Climate_Division也是平均值 . 我只想平均Rain,并根据Climate_Division然后按Date订购 . 有没有办法,我可以这样做:

aggregate(CADaily, by =list(CADaily$Climate_Division, CADaily$Date), FUN = mean, na.rm = TRUE)

哪个日期是某种形式的周?或者还有另一种方式吗?


编辑:

亲爱的大家,

谢谢您的帮助 . 正如我原先想的那样,也许使用聚合并不是最好的方法 . 就产量而言,我想获得数据中每年的平均降雨量(1948年至1995年) . 换句话说,我希望得到一个很好的格式,我可以将其输入到具有星期结束日期形式的时间序列中 . 我正在寻找的输出(请记住可能存在NA值)是:

Climate_Division     Date          Rain
      1                    1948-07-03    1.527778
      1                    1948-07-10    0.6179946
      1                    1948-07-17    0.04166667
      1                    1948-07-24    0.08333333
      ...
      1                    1995-12-23    0.24513245
      1                    1995-12-30    0.12450545

或者是否有更好的方式表达由日期表示的每周数据?

谢谢您的帮助 .

3 回答

  • 0

    更新了答案

    根据OP对请求的更新,我修改了代码以在每周(星期六)的定义日期的日期聚合数据 . 这次我只使用基数R中可用的函数 . 它忽略了NA(如果给定的End_of_Week-Climate_Division只有NA,则得到NaN,而不是数字) .

    # Data with another Climate division as example (same daily values and dates)
    CADaily <-
    structure(list(Climate_Division = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), Date = structure(c(1L, 2L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
    8L, 9L, 10L), .Label = c("01/07/1948", "02/07/1948", "03/07/1948", 
    "04/07/1948", "05/07/1948", "06/07/1948", "17/07/1948", "18/07/1948", 
    "20/07/1948", "22/07/1948"), class = "factor"), Rain = c(0.875, 
    2.9166667, 0.7916667, 0.4305556, 0.8262061, 0.5972222, 0.04166667, 
    0.08333333, 0.04166667, 0.125, 0.875, 2.9166667, 0.7916667, 0.4305556, 
    0.8262061, 0.5972222, 0.04166667, 0.08333333, 0.04166667, 0.125
    ), week = c(27, 27, 27, 27, 27, 27, 29, 29, 29, 30, 27, 27, 27, 
    27, 27, 27, 29, 29, 29, 30)), .Names = c("Climate_Division", 
    "Date", "Rain", "week"), row.names = c(NA, 20L), class = "data.frame")
    
    # Coerce to Date class
    CADaily$Date <- as.Date(x=CADaily$Date, format='%d/%m/%Y')
    
    # Extract day of the week (Saturday = 6)
    CADaily$Week_Day <- as.numeric(format(CADaily$Date, format='%w'))
    
    # Adjust end-of-week date (first saturday from the original Date)
    CADaily$End_of_Week <- CADaily$Date + (6 - CADaily$Week_Day)
    
    # Aggregate over week and climate division
    aggregate(Rain~End_of_Week+Climate_Division, FUN=mean, data=CADaily, na.rm=TRUE)
    
    # Output
    #   End_of_Week Climate_Division       Rain
    # 1  1948-07-03                1 1.52777780
    # 2  1948-07-10                1 0.61799463
    # 3  1948-07-17                1 0.04166667
    # 4  1948-07-24                1 0.08333333
    # 5  1948-07-03                2 1.52777780
    # 6  1948-07-10                2 0.61799463
    # 7  1948-07-17                2 0.04166667
    # 8  1948-07-24                2 0.08333333
    

    其他操作

    此外,使用此代码,您可以从其他聚合函数获得结果,假设结果是每个周分对的相同长度的原子向量 .

    # Aggregate over week and climate division, and show the total number of
    # observations per week, the number of observations which represent missing
    # values, the average, and the standard deviation.
    aggregate(Rain~End_of_Week+Climate_Division, data=CADaily,
              FUN=function(x) c(n=length(x),
                                NAs=sum(is.na(x)),
                                Average=mean(x, na.rm=TRUE),
                                SD=sd(x, na.rm=TRUE)))
    
    # Output. You get NA for the standard deviation if there is only one observation.
    #   End_of_Week Climate_Division     Rain.n   Rain.NAs Rain.Average    Rain.SD
    # 1  1948-07-03                1 3.00000000 0.00000000   1.52777780 1.20353454
    # 2  1948-07-10                1 3.00000000 0.00000000   0.61799463 0.19864151
    # 3  1948-07-17                1 1.00000000 0.00000000   0.04166667         NA
    # 4  1948-07-24                1 3.00000000 0.00000000   0.08333333 0.04166667
    # 5  1948-07-03                2 3.00000000 0.00000000   1.52777780 1.20353454
    # 6  1948-07-10                2 3.00000000 0.00000000   0.61799463 0.19864151
    # 7  1948-07-17                2 1.00000000 0.00000000   0.04166667         NA
    # 8  1948-07-24                2 3.00000000 0.00000000   0.08333333 0.04166667
    

    原始答案

    尝试使用 lubridate 包 . 加载它,然后聚合(作为原始答案的一部分保留作为记录,这反映了OP按周汇总的请求) .

    # Load lubridate package
    library(package=lubridate)
    
    # Set Weeks number. Date already of class `Date`
    CADaily$Week <- week(CADaily$Date)
    
    # Aggregate over week number and climate division
    aggregate(Rain~Week+Climate_Division, FUN=mean, data=CADaily, na.rm=TRUE)
    
    # Output
    #   Week Climate_Division       Rain
    # 1   27                1 1.07288622
    # 2   29                1 0.05555556
    # 3   30                1 0.12500000
    # 4   27                2 1.07288622
    # 5   29                2 0.05555556
    # 6   30                2 0.12500000
    
  • 1

    我从之前的回答中回过头来 . 我认为这个更简单 .

    您只需要找到每行的周末日期,然后汇总

    CADaily <- read.table(text = "Climate_Division       Date      Rain\n1 1948-07-01 0.8750000\n1 1948-07-02 2.9166667\n1 1948-07-03 0.7916667\n1 1948-07-04 0.4305556\n1 1948-07-05 0.8262061\n1 1948-07-06 0.5972222\n1 1948-07-17 0.04166667\n1 1948-07-18 0.08333333\n1 1948-07-20 0.04166667\n1 1948-07-22 0.12500000\n2 1948-07-01 0.8750000\n2 1948-07-02 2.9166667\n2 1948-07-03 0.7916667\n2 1948-07-04 0.4305556\n2 1948-07-05 0.8262061\n2 1948-07-06 0.5972222\n2 1948-07-17 0.04166667\n2 1948-07-18 0.08333333\n2 1948-07-20 0.04166667\n2 1948-07-22 0.12500000", 
        head = T)
    
    CADaily$weekend <- as.POSIXlt(CADaily$Date) + (7 - as.POSIXlt(CADaily$Date)$wday) * 24 * 60 * 60
    
    aggregate(Rain ~ weekend + Climate_Division, data = CADaily, FUN = mean)
    ##      weekend Climate_Division       Rain
    ## 1 1948-07-04                1 1.52777780
    ## 2 1948-07-11                1 0.61799463
    ## 3 1948-07-18                1 0.04166667
    ## 4 1948-07-25                1 0.08333333
    ## 5 1948-07-04                2 1.52777780
    ## 6 1948-07-11                2 0.61799463
    ## 7 1948-07-18                2 0.04166667
    ## 8 1948-07-25                2 0.08333333
    
  • 2

    xts 非常适合这种操纵 . 使用 endpoints 来分组数据,然后 sapply 每周处理一次 .

    CADaily <- read.table(text ='     Climate_Division       Date      Rain
          885                1 1948-07-01 0.8750000
          892                1 1948-07-02 2.9166667
          894                1 1948-07-03 0.7916667
          895                1 1948-07-04 0.4305556
          898                1 1948-07-05 0.8262061
          901                1 1948-07-06 0.5972222
          904                1 1948-07-17 0.04166667
          905                1 1948-07-18 0.08333333
          907                1 1948-07-20 0.04166667
          909                1 1948-07-22 0.12500000',head=T)
    dat.xts <- xts(CADaily[,-2], order.by= as.POSIXct(CADaily[,2]))
    INDEX <- endpoints(dat.xts, 'weeks')
    
    lapply(1:(length(INDEX) - 1), function(y) {
        y <- dat.xts[(INDEX[y] + 1):INDEX[y + 1]]
        data.frame(y$Climate_Division,mean(y$Rain))
    
      })
    

    我的结果是一周一个列表:

    [[1]]
               Climate_Division mean.y.Rain.
    1948-07-01                1     1.168019
    1948-07-02                1     1.168019
    1948-07-03                1     1.168019
    1948-07-04                1     1.168019
    1948-07-05                1     1.168019
    
    [[2]]
               Climate_Division mean.y.Rain.
    1948-07-06                1    0.5972222
    
    [[3]]
               Climate_Division mean.y.Rain.
    1948-07-17                1       0.0625
    1948-07-18                1       0.0625
    
    [[4]]
               Climate_Division mean.y.Rain.
    1948-07-20                1   0.08333334
    1948-07-22                1   0.08333334
    

相关问题