0

我对 R 比较陌生,所以如果这个问题太基本,我很抱歉。

我的交易显示了不同产品的销售数量和收入。因为有三种产品,所以有多种2^3 = 8组合可以在“篮子”中销售这些产品。每个篮子都可以在三个给定年份(2016 年、2017 年、2018 年)和任何区域(东部和西部)中的任何一年出售。[我有两个区域的 3 年交易:东区和西区。]

我的目标是分析在给定区域的给定年份,这些产品的每种组合发生了多少收入、销售了多少数量以及发生了多少交易。

purrr::map我能够通过基于区域拆分数据来执行上述操作(使用)。我创建了一个包含两个数据框的列表,这些数据框包含按“年份”分组的上述每种组合的数据。这很好用。但是,在我看来,代码有点笨拙。有很多重复的说法。我希望能够创建一个 2X3 列表(即 2 个区域和 3 年)

这是我使用区域分割的代码。

第一次尝试

UZone <- unique(Input_File$Zone)
FYear <- unique(Input_File$Fiscal.Year)

  #Split based on zone
  a<-purrr::map(UZone, ~ dplyr::filter(Input_File, Zone == .)) %>%

  #Create combinations of products
  purrr::map(~mutate_each(.,funs(Exists = . > 0), L.Rev:I.Qty )) %>% 

  #group by Fiscal Year
  purrr::map(~group_by_(.,.dots = c("Fiscal.Year", grep("Exists", names(.), value = TRUE)))) %>% 

  #Summarize, delete unwanted columns and rename the "number of transactions" column
  purrr::map(~summarise_each(., funs(sum(., na.rm = TRUE), count = n()), L.Rev:I.Qty)) %>%
    purrr::map(~select(., Fiscal.Year:L.Rev_count)) %>%
    purrr::map(~plyr::rename(.,c("L.Rev_count" = "No.Trans")))

  #Now do Zone and Year-wise splitting : Try 1
  EastList<-a[[1]]
  EastList <- EastList %>% split(.$Fiscal.Year) 

  WestList<-a[[2]]
  WestList <- WestList %>% split(.$Fiscal.Year) 
  write.xlsx(EastList , file = "East.xlsx",row.names = FALSE)
  write.xlsx(WestList , file = "West.xlsx",row.names = FALSE)      

如您所见,上面的代码非常笨拙。由于对 R 的了解有限,我研究了https://blog.rstudio.org/2016/01/06/purrr-0-2-0/并阅读了purrr::map2()手册,但我找不到太多示例。在阅读如何通过并行将向量列表添加到 data.frame 对象列表作为新插槽中的解决方案之后?,我假设我可以使用 X = zone 和 Y= Fiscal Year 来做我上面所做的事情。

这是我尝试过的: 第二次尝试

  #Now try Zone and Year-wise splitting : Try 2
  purrr::map2(UZone,FYear, ~ dplyr::filter(Input_File, Zone == ., Fiscal.Year == .))

但是这段代码不起作用。我收到一条错误消息: Error: .x (2) and .y (3) are different lengths

问题 1:我可以map2用来做我想做的事吗?如果没有,还有其他更好的方法吗?

问题2:以防万一,我们可以使用map2,如何使用一个命令生成两个Excel文件?正如你在上面看到的,我上面有两个函数调用。我只想拥有一个。

问题 3:有没有办法在一个语句中进行求和和计数,而不是下面的两个语句?我正在寻找更简洁的方法来进行求和和计数。

purrr::map(~summarise_each(., funs(sum(., na.rm = TRUE), count = n()), L.Rev:I.Qty)) %>%
    purrr::map(~select(., Fiscal.Year:L.Rev_count)) %>%

有人可以帮帮我吗?


这是我的数据:

dput(Input_File)

structure(list(Zone = c("East", "East", "East", "East", "East", 
"East", "East", "West", "West", "West", "West", "West", "West", 
"West"), Fiscal.Year = c(2016, 2016, 2016, 2016, 2016, 2016, 
2017, 2016, 2016, 2016, 2017, 2017, 2018, 2018), Transaction.ID = c(132, 
133, 134, 135, 136, 137, 171, 171, 172, 173, 175, 176, 177, 178
), L.Rev = c(3, 0, 0, 1, 0, 0, 2, 1, 1, 2, 2, 1, 2, 1), L.Qty = c(3, 
0, 0, 1, 0, 0, 1, 1, 1, 2, 2, 1, 2, 1), A.Rev = c(0, 0, 0, 1, 
1, 1, 0, 0, 0, 0, 0, 1, 0, 0), A.Qty = c(0, 0, 0, 2, 2, 3, 0, 
0, 0, 0, 0, 3, 0, 0), I.Rev = c(4, 4, 4, 0, 1, 0, 3, 0, 0, 0, 
1, 0, 1, 1), I.Qty = c(2, 2, 2, 0, 1, 0, 3, 0, 0, 0, 1, 0, 1, 
1)), .Names = c("Zone", "Fiscal.Year", "Transaction.ID", "L.Rev", 
"L.Qty", "A.Rev", "A.Qty", "I.Rev", "I.Qty"), row.names = c(NA, 
14L), class = "data.frame")

输出格式:这是生成输出的代码。我希望看到EastList.2016EastList.2017作为一个 Excel 文件中的两张表,以及WestList.2016,WestList.2017WestList.2018作为一个 Excel 文件中的 3 张表。

  #generate the output:
  EastList.2016 <- EastList[[1]]
  EastList.2017 <- EastList[[2]]
  WestList.2016 <- WestList[[1]]
  WestList.2017 <- WestList[[2]]
  WestList.2018 <- WestList[[3]]
4

1 回答 1

0

两个按年份细分的列表,每个列表都有总和和计数?

dplyr : (df <- 你的数据框)

df %>% 
group_by(Zone, Fiscal.Year) %>%
summarise_at(vars(L.Rev:I.Qty), funs(sum = sum, cnt = n()))

Source: local data frame [5 x 14]
Groups: Zone [?]

   Zone Fiscal.Year L.Rev_sum L.Qty_sum A.Rev_sum A.Qty_sum I.Rev_sum I.Qty_sum L.Rev_cnt L.Qty_cnt A.Rev_cnt A.Qty_cnt I.Rev_cnt I.Qty_cnt
  <chr>       <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <int>     <int>     <int>     <int>     <int>     <int>
1  East        2016         4         4         3         7        13         7         6         6         6         6         6         6
2  East        2017         2         1         0         0         3         3         1         1         1         1         1         1
3  West        2016         4         4         0         0         0         0         3         3         3         3         3         3
4  West        2017         3         3         1         3         1         1         2         2         2         2         2         2
5  West        2018         3         3         0         0         2         2         2         2         2         2         2         2
于 2017-01-06T17:00:28.533 回答