Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R,对于每年,我需要对同两个日期之间不同年份的销售额求和_R_Dplyr - Fatal编程技术网

使用R,对于每年,我需要对同两个日期之间不同年份的销售额求和

使用R,对于每年,我需要对同两个日期之间不同年份的销售额求和,r,dplyr,R,Dplyr,对于两个不同的年份,每年,我需要对从1月3日到3月3日发生的所有销售进行汇总。我更喜欢dplyr解决方案 我在stackoverflow中看到的所有可能的解决方案都使用SQL,而不是R。如果有人知道我错过的解决方案,请告诉我 在R中,我知道如何使用组和各种dplyr函数,但我需要帮助来完成这篇文章的内容 我希望输出如下所示: Year Total Sales 2020 138 2021 196 输入 df <- data.frame(date=c(20200102, 202

对于两个不同的年份,每年,我需要对从1月3日到3月3日发生的所有销售进行汇总。我更喜欢dplyr解决方案

我在stackoverflow中看到的所有可能的解决方案都使用SQL,而不是R。如果有人知道我错过的解决方案,请告诉我

在R中,我知道如何使用组和各种dplyr函数,但我需要帮助来完成这篇文章的内容

我希望输出如下所示:

Year   Total Sales
2020   138 
2021   196
输入

df <- data.frame(date=c(20200102, 20200107, 20200210, 20200215, 20200216, 20200302, 20200305, 20210101, 20210104, 20210209, 20210211, 20210215, 20210317, 20210322),
                  sales=c(9,14,27,30,33,34,36,44,45,47,51,53,56,58))

df我们可以使用
tidyverse
。将“日期”转换为
date
类(从
lubridate
中使用
ymd
),从“日期”中获取
月和
日,使用
ISOdate
创建一个新日期,将
年标准化为一年(这里我们选择2021年,但它可以是任何一年),然后我们使用
between
过滤“newdate”,并指定
left
right
参数作为自定义日期范围,然后按“年”分组,并在
summary
中获得“sales”的
总和

library(dplyr)
library(lubridate)
df %>%
  mutate(date = ymd(date), year = year(date),
   month = month(date), day = day(date), 
   newdate = as.Date(ISOdate(2021, month, day))) %>% 
  filter(between(newdate, as.Date("2021-01-03"), 
        as.Date("2021-03-03"))) %>% 
  group_by(year) %>%
  summarise(sales = sum(sales))
-输出

# A tibble: 2 x 2
#   year sales
#  <dbl> <dbl>
#1  2020   138
#2  2021   196

比我的akrun大师的解决方案少一行:)

  • 使用
    ymd
    功能的
    lubridate
    包将字符类型转换为最新
  • 使用代码>月月< /代码>函数只考虑月份和日期,按月份和日期< /LI>所需间隔。
  • 年份分组
  • 过滤间隔
  • 总结
  • 库(lubridate)
    df%>%
    突变(日期=ymd(日期))%>%
    变异(DayMonth=格式(如.Date(日期),%m-%d))%>%
    分组依据(年=年(日))%>%
    过滤器(DayMonth>“01-03”和DayMonth%
    总结(总销售额=总销售额)
    
    输出:

       Year Total_Sales
      <int>       <dbl>
    1  2020         138
    2  2021         196
    
    年度总销售额
    1  2020         138
    2  2021         196
    
    您也可以使用以下解决方案:

    library(dplyr)
    library(lubridate)
    
    df %>%
      mutate(date = ymd(date)) %>%
      group_by(year = year(date)) %>%
      filter(date %within% interval(ymd(paste(first(year), "01-03", sep = "-")), 
                                    ymd(paste(first(year), "03-03", sep = "-")))) %>%
      summarise(sale = sum(sales))
    
    # A tibble: 2 x 2
       year  sale
      <dbl> <dbl>
    1  2020   138
    2  2021   196
    
    库(dplyr)
    图书馆(lubridate)
    df%>%
    突变(日期=ymd(日期))%>%
    分组依据(年=年(日))%>%
    筛选(日期%在%间隔内(ymd)(粘贴(第一年),“01-03”,sep=“-”)),
    ymd(粘贴(第一(年),“03-03”,sep=“-”))%>%
    总结(销售额=总额(销售额))
    #一个tibble:2x2
    年销售额
    1  2020   138
    2  2021   196
    
    一种仅使用整数/模除法的简单解决方案,
    %%
    %%
    ,即不使用任何日期类型库(lubridate等)

    • 由于您的日期变量遵循最符合逻辑(并且最适合日期的算术排序)的格式,因此这里的工作是检查前四位的条件/分组,过滤后四位并汇总。因此
    • group\u by
      on
      Year
      通过整数除法获得,即
      %/%
      date by
      10000
      ,它将始终为您提供前四位数字(在YYYYMMDD格式的情况下)
    • 无需先创建此列,然后按分组
    • 然后,使用
      date
      的模除
      %%
      通过
      10000
      获得最后四位数字来过滤行,并检查您的条件
    • 最后总结
    • 如果日期列为字符类型,请在所有步骤中使用
      as.numeric
      将其换行
    库(dplyr)
    df%>%
    分组依据(年份=日期%/%10000)%>%
    过滤器(日期%%10000>103,日期%%10000<303)%
    总结(总销售额=总销售额)
    #>#tibble:2x2
    #>年度总销售额
    #>          
    #> 1  2020         138
    #> 2  2021         196
    
    由(v2.0.0)于2021年5月30日创建


    等价baseR语法

    aggregate(sales ~ cbind(Year = date %/% 10000), 
              subset(df, date %% 10000 > 103 & date %% 10000 < 303), 
              FUN = sum)
      Year sales
    1 2020   138
    2 2021   196
    
    合计(销售额~cbind(年份=日期%/%10000),
    子集(df,日期%%10000>103和日期%%10000<303),
    乐趣=总和)
    年销售额
    1 2020   138
    2 2021   196
    
    非常好!甚至少了一排:)你真是太好了,我的朋友。我知道这是很不寻常的,尽管尝试采用这种形式来与你们已经发布的不同。亲爱的@TarJae,您可以将其进一步缩短至少一行,
    df%>%groupby(Year=Year(ymd(date))%%>%mutate(daymount=format(ymd(date))%%>%filter(daymount>“01-03”和daymount<“03-03”)%%>%摘要(Total_Sales=sum(Sales))
    Brilliant!。感谢您的理念!
    library(dplyr)
    library(lubridate)
    
    df %>%
      mutate(date = ymd(date)) %>%
      group_by(year = year(date)) %>%
      filter(date %within% interval(ymd(paste(first(year), "01-03", sep = "-")), 
                                    ymd(paste(first(year), "03-03", sep = "-")))) %>%
      summarise(sale = sum(sales))
    
    # A tibble: 2 x 2
       year  sale
      <dbl> <dbl>
    1  2020   138
    2  2021   196
    
    library(dplyr)
    
    df %>% 
      group_by(Year = date %/% 10000) %>%
      filter(date %% 10000 > 103, date %% 10000 < 303) %>%
      summarise(Total_sales = sum(sales))
    
    #> # A tibble: 2 x 2
    #>    Year Total_sales
    #>   <dbl>       <dbl>
    #> 1  2020         138
    #> 2  2021         196
    
    aggregate(sales ~ cbind(Year = date %/% 10000), 
              subset(df, date %% 10000 > 103 & date %% 10000 < 303), 
              FUN = sum)
      Year sales
    1 2020   138
    2 2021   196