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

时间:2020-05-11 19:30:02

标签: r sum

我是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上花费的金额,因此这里有两个月,我想分别获得一月和二月的总金额。

任何帮助,将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

这能回答您的问题吗?

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

sums是一个列表:因此,如果要访问例如2月的基准,则可以执行以下操作:

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

添加

另一种(有趣的)解决方案是通过正则表达式:您将日期定义为一种模式,然后使用sub和向后引用\\1来调用破折号之间的两个数字,将它们减少到月份部分:

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

答案 1 :(得分:1)

我们可以将'date'转换为lengthAdjust类,获取 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 245 55"> <defs> <style> .cls-1,.cls-3{font-size:48px;font-family:SHOOTING,Arial;} .cls-2{letter-spacing:-0.02em;} .cls-3{fill:#ffb857;} .cls-4{fill:#ff8f00;letter-spacing:0em;} </style> </defs> <title>logo</title> <g id="Capa_4" data-name="Capa 4"> <text class="cls-1" x="41" y="41.79" textLength="200" lengthAdjust="spacingAndGlyphs">BUS<tspan class="cls-2" >C</tspan><tspan>AMINAS</tspan></text> </g> <g id="Capa_3" data-name="Capa 3"> <text textLength="200" lengthAdjust="spacingAndGlyphs" class="cls-3" x="42.76" y="40.32">BUS<tspan class="cls-2" >C</tspan><tspan>A</tspan><tspan class="cls-4">MINAS</tspan></text> <path id="b" d="M34.69,19.49a1.27,1.27,0,0,0-.7-.72,1.29,1.29,0,0,0-1,0,11.93,11.93,0,0,0-4,2.63,12.08,12.08,0,0,0-2.63,4,1.29,1.29,0,0,0,0,1,1.26,1.26,0,0,0,.73.7,1.34,1.34,0,0,0,.49.1,1.28,1.28,0,0,0,1.25-.83,9.17,9.17,0,0,1,2-3.07,9.06,9.06,0,0,1,3.08-2,1.39,1.39,0,0,0,.72-.73A1.29,1.29,0,0,0,34.69,19.49Zm19.53-7.37,1,1-5.06,5,1.41,1.4a1.29,1.29,0,0,1,.4.95,1.26,1.26,0,0,1-.4.94L50.2,22.73a14.61,14.61,0,0,1,.69,12.78,14.32,14.32,0,0,1-7.77,7.77,14.55,14.55,0,0,1-11.34,0,14.69,14.69,0,0,1-4.66-3.11,14.75,14.75,0,0,1-4.26-10.33A14.26,14.26,0,0,1,24,24.17a14.58,14.58,0,0,1,20.55-7.08l1.32-1.33a1.31,1.31,0,0,1,.95-.39,1.29,1.29,0,0,1,.94.39l1.41,1.41ZM54.38,11a.63.63,0,0,1-.45.21.66.66,0,0,1-.48-.21L51.56,9.09a.72.72,0,0,1-.18-.48.67.67,0,0,1,1.14-.47L54.38,10a.61.61,0,0,1,.21.47A.59.59,0,0,1,54.38,11Zm4.77,4.77a.69.69,0,0,1-.95,0l-1.87-1.88a.63.63,0,0,1,0-.94.6.6,0,0,1,.47-.2.58.58,0,0,1,.46.2l1.89,1.87a.69.69,0,0,1,0,1Zm.85-3.8a.62.62,0,0,1-.19.48.65.65,0,0,1-.47.19h-2a.65.65,0,0,1-.67-.67.65.65,0,0,1,.19-.47.62.62,0,0,1,.48-.19h2a.65.65,0,0,1,.66.66ZM56,8v2a.66.66,0,1,1-1.32,0V8A.66.66,0,1,1,56,8Zm3.13,1.14L57.26,11a.61.61,0,0,1-.45.21.66.66,0,0,1-.48-.21.59.59,0,0,1-.21-.46.61.61,0,0,1,.21-.47L58.2,8.14A.64.64,0,0,1,58.67,8a.65.65,0,0,1,.67.66A.73.73,0,0,1,59.15,9.09Z" transform="translate(-22.86 -1.21)"/> </g> </svg>,并将其用作分组列,而将<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 用作'total_bill'

 <fmt:formatDate value=${reservation.startDate} pattern="yyyy-MM-dd"/>

如果需要,我们可以将其转换为“宽”格式

Single<ResultType> result1 = Single.<ResultType>create(source -> {
    source.onSuccess(method1(parameters));
}).subscribeOn(Schedulers.io());
Single<ReturnType> result2 = Single.<ResultType>create(source -> {
    source.onSuccess(method2(parameters));
}).subscribeOn(Schedulers.io());

if (null != result1 && null != result2) {

如果我们还需要按“年”分组

Date

答案 2 :(得分: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