使用R,对于每年,我需要对同两个日期之间不同年份的销售额求和
对于两个不同的年份,每年,我需要对从1月3日到3月3日发生的所有销售进行汇总。我更喜欢dplyr解决方案 我在stackoverflow中看到的所有可能的解决方案都使用SQL,而不是R。如果有人知道我错过的解决方案,请告诉我 在R中,我知道如何使用组和各种dplyr函数,但我需要帮助来完成这篇文章的内容 我希望输出如下所示:使用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
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
onYear
通过整数除法获得,即%/%
date by10000
,它将始终为您提供前四位数字(在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