R语言 基于时间段对列值求和

thtygnil  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(323)

日期|成本费用
第1-1-22页|五元
1月1日22日|十元
1月1日22日|八元
2月5日至22日|九元
2022年2月5日|十元
2022年3月5日|五元
2022年3月7日|十元
2019年至2018年
如何将单月、季度和年度的总成本相加?
在下面尝试了此方法---但对于大型数据集,它提供了许多按年度和季度划分的NA值

tempDF <- tempDF %>%
  mutate(
    Date = lubridate::dmy(Date),
    Month = lubridate::month(Date),
    Year = lubridate::year(Date)
  ) %>%
  left_join(quarters, by='Month')

tempDF %>%
  group_by(Year) %>%
  summarise(total = sum(Cost))

# A tibble: 1 × 2
#    Year total
#   <dbl> <dbl>
# 1  2022    57

tempDF %>%
  group_by(Quarter) %>%
  summarise(total = sum(Cost))

# A tibble: 3 × 2
#   Quarter total
#   <chr>   <dbl>
# 1 Q1         23
# 2 Q2         24
# 3 Q3         10

tempDF %>%
  group_by(Month) %>%
  summarise(total = sum(Cost))

# A tibble: 3 × 2
#   Month total
#   <dbl> <dbl>
# 1     1    23
# 2     5    24
# 3     7    10
w8biq8rn

w8biq8rn1#

假设

  • 在最后的注解中可重复显示的数据
  • 需要的是按年/月、年/季度和年计算的成本列的总和
  • 在求和之前删除任何NA

然后首先清除它(在Date中更改- to /并将Date转换为Date类,删除Cost中的$并将Cost转换为numeric),给出DF2,然后按yearmon、yearqtr和year分组并汇总:
据推测,您得到的NA要么是因为没有清理数据,要么是因为数据中有NA,然后没有使用sum(..., na.rm = TRUE)

library(dplyr)
library(zoo)
 
DF2 <- DF %>%
  mutate(Date = as.Date(gsub("-", "/", Date), "%m/%d/%y"),
         Cost = as.numeric(sub("\\$", "", Cost)))

DF2 %>%
  group_by(yearmon = as.yearmon(Date)) %>%
  summarize(Cost = sum(Cost, na.rm = TRUE))
## # A tibble: 3 × 2
##   yearmon    Cost
##   <yearmon> <dbl>
## 1 Jan 2022     23
## 2 Feb 2022     19
## 3 Mar 2022     15

DF2 %>%
  group_by(yearqtr = as.yearqtr(Date)) %>%
  summarize(Cost = sum(Cost, na.rm = TRUE))
## # A tibble: 1 × 2
##   yearqtr    Cost
##   <yearqtr> <dbl>
## 1 2022 Q1      57

DF2 %>%
  group_by(year = as.integer(as.yearmon(Date))) %>%
  summarize(Cost = sum(Cost, na.rm = TRUE))
## # A tibble: 1 × 2
##    year  Cost
##   <int> <dbl>
## 1  2022    57

注意

Lines <- "Date | Cost
1-1-22 | $5
1/1/22 | $10
1/1/22 | $8
2/5/22 | $9
2/5/22 | $10
3/5/22 | $5
3/7/22 | $10"
DF <- read.table(text = Lines, header = TRUE, sep = "|", strip.white = TRUE)

相关问题