如何计算总金额取决于R中的日期?

问题描述 投票:0回答:2

我是R的新手,我在计算每个月的账单金额时遇到了问题。我有如下的数据框架,我的目标是计算每个月的消费金额。

dat <- data.frame(
  time = factor(c("Breakfast","Breakfast","Breakfast","Breakfast","Breakfast","Breakfast"), levels=c("Breakfast")), date=c("2020-01-20","2020-01-21","2020-01-22","2020-02-10","2020-02-11","2020-02-12"),
  total_bill = c(12.7557,14.8,17.23,15.7,16.9,13.2)
)

我的目标是计算出每个月的消费金额。Breakfast 所以我们有两个月,我想分别得到一月和二月的总和。

任何帮助,这将是非常感激。谢谢你!我是R的新手,我有计算账单金额的问题。

r sum
2个回答
1
投票

我们可以将 "日期 "转换为 Date 类,获得 month,并将其作为分组列和 sum 的'总帐单'。

library(dplyr)
dat %>%
    group_by(time, Month = format(as.Date(date), "%B")) %>% 
    summarise(total_bill = sum(total_bill, na.rm = TRUE))
# A tibble: 2 x 3
# Groups:   time [1]
#  time      Month    total_bill
#  <fct>     <chr>         <dbl>
#1 Breakfast February       45.8
#2 Breakfast January        44.8

如果需要的话,我们可以将其转换为 "宽幅 "格式。

library(tidyr)
out <- dat %>%
     group_by(time, Month = format(as.Date(date), "%B")) %>% 
     summarise(total_bill = sum(total_bill, na.rm = TRUE)) %>% 
     pivot_wider(names_from = Month, values_from = total_bill)

out
# A tibble: 1 x 3
# Groups:   time [1] 
#   time      February January
#  <fct>        <dbl>   <dbl>
# 1 Breakfast     45.8    44.8

如果我们还需要按 "年份 "来分组的话

out <- dat %>%
     mutate(date = as.Date(date)) %>%
     group_by(time, Year = format(date, "%Y"), Month = format(date, "%B")) %>% 
     summarise(total_bill = sum(total_bill, na.rm = TRUE)) 

2
投票

这是否回答了你的问题?

sums <- tapply(dat$total_bill, format(as.Date(dat$date), "%B"), sum)
February  January 
 45.8000  44.7857 

sums是一个列表:因此,如果你想访问,例如,二月的数据,你可以这样做。

sums[1]
February 
    45.8

或者,你也可以转换 sums 到一个数据框中,并通过月份名称访问每月的总和。

sums <-  as.data.frame.list(tapply(dat$total_bill, format(as.Date(dat$date), "%B"), sum))
sums$February 
    45.8

加法:

另一个(有趣的)解决方案是通过regex:你把日期定义为一个模式,然后使用 sub 加回参考 \\1 为了回忆破折号之间的两个数字,将它们减少到月份部分。

tapply(dat$total_bill, sub("\\d{4}-(\\d{2})-\\d{2}", "\\1", dat$date), sum)
     01      02 
44.7857 45.8000  

0
投票
library(dplyr)
d_sum <- dat %>% 
  group_by(substr(date, 0, 7)) %>%
  summarise(sum = sum(total_bill))

d_sum
# A tibble: 2 x 2
  `substr(date, 0, 7)`   sum
  <chr>                <dbl>
1 2020-01               44.8
2 2020-02               45.8
© www.soinside.com 2019 - 2024. All rights reserved.