我有要转换为每周总和的每日交易数据(即,截至星期日的一周内,每周的交易总和)。
当前的结构是这样的
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))
金额-是支出。
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")
任何建议将不胜感激。
答案 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天
答案 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()
,它将在一个列表中的不同数据框中分隔所有类别。数据框列表。