【问题标题】:how to sum data by month and store them in the first day of the month如何按月汇总数据并将其存储在当月的第一天
【发布时间】:2016-01-11 14:49:00
【问题描述】:

假设我有一个如下数据框:

gageID    date        flow_cms
1011000 1937-02-19   25.768334
1011000 1937-02-20   24.918828
1011000 1937-02-21   24.069322

我想汇总具有相同月份的行汇总流,并且 将结果存入一个新的数据值:每个月的第一天;为了获得以下输出:

gageID  date  sum_monthly_flow
1011000 1937-02-01  500.2222
1011000 1937-03-01  589.222

我正在使用这条线:

>rowsum(qfile$flow_cms, format(qfile$date, '%Y-%m-01'))

我得到了正确的总和,但我也想减少记录天数 独特的一天:每个月的第一天!上面的条带显示,R不能 将左列识别为数据(或日期)。

非常感谢您的帮助!

【问题讨论】:

    标签: r date aggregate


    【解决方案1】:

    首先确保您的“日期”列正确格式化为 R 中的日期对象:

    qfile$date <- as.Date(qfile$date, format = "%Y-%m-%d")
    

    然后我们可以使用format提取月份和年份,并使用group_by求和并取第一个日期:

    library(dplyr)
    qfile %>% mutate(monthyear = as.character(format(date, "%m-%Y"))) %>%
              arrange(date) %>% 
              group_by(monthyear) %>%
              summarise(date=date[1], flow = sum(flow_cms))
    

    这将为您提供数据中每个月的第一条记录。

    【讨论】:

    • 非常感谢 Jeremycg 先生!
    【解决方案2】:

    另一种解决方案:

    df
       gageID       date  flow_cms
    1 1011000 1937-02-19  25.76833
    2 1011000 1937-02-20  24.91883
    3 1011000 1937-02-21  24.06932
    4 1011000 1937-03-20  12.22200
    5 1011000 1937-03-01 589.22200
    
    df1 = aggregate(list(flow_cms=df$flow_cms),by=list(dates=cut(as.POSIXct(df$date),"month")),sum)
    
    df1
           dates  flow_cms
    1 1937-02-01  74.75648
    2 1937-03-01 601.44400
    

    【讨论】:

      【解决方案3】:

      使用data.tablelubridate你可以试试:

      library(data.table)
      setDT(qfile)[, lapply(.SD, sum), by = .(gageID, date = lubridate::floor_date(date, "month"))]
      
          gageID       date  flow_cms
      1: 1011000 1937-02-01  74.75648
      2: 1011000 1937-03-01 601.44400
      

      请注意,假设date 已经属于Date 类,而gageID 是另一个分组参数。

      另外,使用data.table 自己的mday() 函数(感谢@Henrik)可以避免从另一个包调用函数:

      setDT(qfile)[, lapply(.SD, sum), by = .(gageID, date = date - mday(date) + 1)] 
      

      数据

      这里使用Abdou's sample data

      qfile <- structure(list(gageID = c(1011000L, 1011000L, 1011000L, 1011000L, 
      1011000L), date = structure(c(-12004, -12003, -12002, -11975, 
      -11994), class = "Date"), flow_cms = c(25.76833, 24.91883, 24.06932, 
      12.222, 589.222)), .Names = c("gageID", "date", "flow_cms"), row.names = c(NA, 
      -5L), class = "data.frame")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-05
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多