【问题标题】:Aggregate Data by date按日期汇总数据
【发布时间】:2016-05-09 23:08:23
【问题描述】:

我正在处理以下数据框:

VAL1 <- c("AA", "BB", "CC", "DD", "BB", "DD", "AA", "DD")
D01012016 <- c(2, 4, 2, 6, 8, 8, 12, 4)
D02012016 <- c(3, 3, 2, 1, 1, 2,4, 4)
D03022016 <- c(2, 2, 3, 4, 3, 5, 5, 7)
D05022016 <- c(1, 3, 3, 1, 2,3, 3, 6)
D03032016 <- c(2, 1, 1, 1, 5, 3, 2, 1)
D01042016 <- c(2, 4, 2, 6, 8, 8, 12, 4)
D02042016 <- c(3, 3, 2, 1, 1, 2,4, 4)
D03042016 <- c(2, 2, 3, 4, 3, 5, 5, 7)
D05042016 <- c(1, 3, 3, 1, 2,3, 3, 6)
D05052016 <- c(2, 3, 7, 1, 1, 1, 1, 1)
D23062016 <- c(2, 1, 1, 1, 5, 3, 2, 1)
D05072016 <- c(1, 3, 3, 1, 2,3, 3, 6)
D03082016 <- c(2, 1, 1, 1, 5, 3, 2, 1)
D01092016 <- c(2, 4, 2, 6, 8, 8, 12, 4)
D12092016 <- c(3, 3, 2, 1, 1, 2,4, 4)
D05102016 <- c(2, 1, 1, 1, 5, 3, 2, 1)
D21112016 <- c(2, 4, 2, 6, 8, 8, 12, 4)
D13122016 <- c(3, 3, 2, 1, 1, 2,4, 4)
df <- data.frame(D01012016, D02012016, D03022016,D05022016,D03032016,D01042016,D02042016,D03042016,D05042016,D05052016,D23062016,D05072016,D03082016,D01092016,D12092016,D05102016,D21112016,D13122016)

Colnames 是 Dddmmyyyy 格式的日期,我需要对数据进行分组,在第一列中保持 VAL1(VAL 的重复值必须保持分开)并将其每月值分组(第二个 colnames 必须是月份名称,并且数据必须使用 sum() 函数进行聚合)。 最终数据集必须具有相同的行数(并且所有 VAL1 必须位于相同的位置)并且只有 12 列(每月一列)

【问题讨论】:

  • 聚合是什么意思?你的预期输出是什么?另外,在 R 中聚合时间序列数据肯定有很多答案。
  • @Gopala,每月获取一列(如果是每月)或每季度获取一列(如果是季度)。我知道,我只是 R 的初学者,我没有找到任何我必须按 colnames 聚合的东西,并且日期在实际日期之前有一个字符
  • @ZheyuanLi,你好! :) 不,原始数据框必须仅针对列数进行更改,每日值必须使用 sum() 按月分组。因此行数将保持不变,但列数仅为 12

标签: r


【解决方案1】:

这是一个使用 reshape2(也可以使用 tidyr 或 reshape)包来改造您的数据框和 dplyr 库来总结您的结果的解决方案:

df <- data.frame(VAL1, D01012016, D02012016, D03022016,D05022016,D03032016,D01042016,D02042016,D03042016,D05042016,D23062016,D05072016,D03082016,D01092016,D12092016)

library(reshape2)
ndf<-melt(df)
ndf$date<-as.Date(ndf$variable, format="D%d%m%Y")

library(dplyr)
summarize(group_by(ndf, VAL1, cut(ndf$date, breaks ="1 month")), sum(value))

很难使用按列格式,因此从宽格式转换为长格式更容易。 VAL1 来自熔化命令。如果您对季度结果感兴趣,只需将休息时间从 1 个月更改为 3 个月。

【讨论】:

  • 谢谢,但问题比看起来更难,我不能使用合并功能,因为我需要在第一列中重复数据...我重新编辑了问题以更精确。跨度>
  • 好的,谢谢,但我有一个问题:使用melt() 后如何返回到第一个数据帧的相同结构?行数相同,但只有 12 列
  • reshape2 库中的 dcast 命令可以将长格式转换为宽格式。根据您的列名,公式将类似于:dcast(finaldf, VAL1~month)
  • 完美..唯一的问题是使用summarize(group_by(ndf, VAL1, cut(ndf$date, breaks ="1 month")), sum(value)) 我获得了一个只包含两列的df,一列包含月份,另一列包含总和,但只有12行,就好像它只是按月聚合一样不考虑 VAL1(我想为每个 VAL1 获取 12 行)
  • 你应该已经从 summarise 命令中获得了 3 列,标题为:VAL1、cut(ndf$date,breaks = "1 month") 和 sum(value)。我的结果有 3 列乘 32 行,我不确定您的结果在哪里不同。
【解决方案2】:

这是一个使用data.table的选项

library(data.table)
melt(setDT(df), id.var="VAL1")[, date := as.Date(variable, "D%d%m%Y")][
          ,.(Sum=sum(value)) , by = .(VAL1, grp = cut(date, breaks= "1 month"))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2022-01-07
    相关资源
    最近更新 更多