我是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的新手,我有计算账单金额的问题。
我们可以将 "日期 "转换为 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))
这是否回答了你的问题?
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
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