如何合并具有相似名称的行并为不同年份创建列?

问题描述 投票:0回答:1

我正在努力汇总原始数据,以向所有客户显示过去 10 年的历史销售情况。每行包括 (1) 公司名称、(2) 零件号、(3) 销售年份、(4) 数量。对我们一些顶级客户的销售包括许多行,上面列出了每张发票的详细信息。

    Company_1      2013     part_number_1      quantity_1
    Company_1      2013     part_number_2      quantity_2
    Company_1      2015     part_number_1      quantity_3
    Company_2      2013     part_number_3      quantity_4
    Company_2      2016     part_number_4      quantity_5

我希望将第一列中的公司名称和其余列中的 2013 - 2023 年数据进行合并。如果对特定公司的销售占用原始数据中的 150 行,则应将这些行聚合为 1 行,细分每年的销售数量。

| Company Name | 2013     | 2014     | 2015     |
| --------     | -------- | -------- | -------- |
| Company 1    | Quantity | Quantity | Quantity |
| Company 2    | Quantity | Quantity | Quantity |...

sales_data_clean <- sales_data_raw %>% 
  rename(part_number = Base,
         year = Year,
         company_name = `Company Name`,
         quantity = Quantity)

sales_data_grouped <- sales_data_clean %>% 
  select(company_name, part_number, year, quantity)

我编写了上述代码,但无法弄清楚如何合并类似公司的数据并根据表中的销售数量创建 2013 - 2023 年的新列。

任何帮助将不胜感激。

r tidy
1个回答
0
投票

首先,阅读本文,并始终在您的问题中包含示例或玩具数据:您将获得更好更快的帮助。

如果您只想汇总每个公司的年销售额(

quantity
),而不考虑各个部分(
part_number
),请尝试以下操作:
(PS.玩具数据在最后)

代码:

library(tidyverse)

toy_sales %>% 
  summarise(.by = c(company_name, year), quantity = sum(quantity)) %>% 
  pivot_wider(names_from = year, values_from = quantity, names_prefix = "y_")

输出:

# A tibble: 3 × 7
  company_name y_2010 y_2011 y_2012 y_2013 y_2014 y_2015
  <chr>         <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 John_Beatles   5075   3875   2700   3975   4000   3250
2 Mick_Stones    1250   4025   4475   3200   2975   3450
3 Paul_Beatles   3225   3875   2075   3925   3650   3700

玩具数据:

set.seed(123)
sample_x <- \(x) sample(x, 250, replace = TRUE)

toy_sales <- tibble(
  company_name = sample_x(paste0(band_members$name, "_", band_members$band)),
  year = sample_x(2010:2015),
  part_number = sample_x(1:10),
  quantity = sample_x(seq.int(0, 500, by = 25))
) %>% 
  
  arrange(across(everything()))
© www.soinside.com 2019 - 2024. All rights reserved.