将每日交易数据转换为每周末的总和

时间:2020-04-16 10:21:51

标签: r

我有要转换为每周总和的每日交易数据(即,截至星期日的一周内,每周的交易总和)。

当前的结构是这样的

dataset <- data.frame(date=as.Date(c("20200407", "20200407", "20200407", "20200407"), "%Y%m%d"), category=c("Petrol Station", "Accomodation", "Discount Store", "Shopping"), amount=c(5431.47, 839.1, 2399.13, 1305.82))

  • 日期-本质上是当天的所有不同交易(我已经使用ydm函数重新格式化)
  • 类别-不同的支出类型
  • 金额-是支出。

    date        category        amount
    2020-04-07  Petrol Station  5431.47
    2020-04-07  Accommodation   839.1
    2020-04-07  Discount Store  2399.13
    2020-04-07  Shopping        1305.82
    

在3年的数据中,总共大约有10万行

我可以使用以下内容创建一个星期变量(为我提供W1,W2,...等),并通过分组对其求和。但是,在没有整整7天的第1周和第52周中,它似乎无法正常工作

dataset$Week <- strftime(dataset$date, format = "%Y-W%V")

任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

尝试一下:

library(tidyverse)
library(lubridate)

dataset%>%
  mutate(week = week(date))%>%
  group_by(week)%>%
  summarize(week_sum = sum(amount))

如果您想获得etxtra“类别”评估,则比:

dataset%>%
  mutate(week = week(date))%>%
  group_by(week, category)%>%
  summarize(week_category_sum = sum(amount))

编辑:

@TobKel这样的东西-但对于类别列中的每个子类别(大约有100个)。

我可以产生以下罚款,只是其中的第01周和第52周没有整整7天

output

答案 1 :(得分:1)

在使用data.table和lubridate包的示例中:

library(lubridate)
library(data.table)
# convert data.frame to data.table
setDT(dataset)
# add week variable, then sum grouping by week and category 
dataset[, week := week(date)][, 
  wkSum = sum(amount), keyby = c("week", "category")]

略微修改示例数据以涵盖多个星期,并重复输入类别以表明其有效,此输入

         date       category  amount
1: 2020-04-06       Shopping 1203.54
2: 2020-04-07 Petrol Station 5431.47
3: 2020-04-07       Shopping 1305.82
4: 2020-04-08       Shopping 1400.43

提供输出

   week       category   wkSum
1:   14 Petrol Station 5431.47
2:   14       Shopping 2509.36
3:   15       Shopping 1400.43

答案 2 :(得分:0)

@TobKei的贡献是巨大的,您只需要更改数据集的结构即可实现所需的功能。本质上,您需要将每个类别的值作为变量,以便能够生成每周总和而不是一个单一的数字。您可能需要尝试以下方法:

library(tidyverse)
library(dplyr)
library(lubridate)

sum_output <- dataset %>%
  mutate(week = week(date)) %>%
  spread(., category, amount) %>%
  group_by(week) %>%
  summarise(accomodation_week_sum = sum(Accomodation), 
         discount_store_week_sum= sum(`Discount Store`), 
         Petrol_week_sum=sum(`Petrol Station`), 
         shopping_week_sum= sum(Shopping))

由于您在同一周没有更多观察数据,因此目前该数字是相同的,但是最终如果您有更多group_by(),则每周将向您返还一笔款项。

UPDATE :如果您有数百个显然不想单独键入的类别,则下面的方法应该起作用:

library(tidyverse)
library(dplyr)
library(lubridate)

sum_output <- dataset %>%
  mutate(week = week(date)) %>%
  split(.$category) %>%
  lapply(., group_by, week) %>%
  lapply(., summarise, week_sum_amount=sum(amount)) %>%
  bind_rows(., .id = "week_sum_amount") %>% 
  data.frame(check.names = FALSE)

主要添加的内容是split(),它将在一个列表中的不同数据框中分隔所有类别。数据框列表。