首页
学习
活动
专区
圈层
工具
发布

汇总行
EN

Stack Overflow用户
提问于 2021-07-04 14:17:58
回答 1查看 36关注 0票数 0

我试图从我们的商店订购工具中减少和简化数据集。我们的工具将每个订单行导出为具有重复值的新订单。例如,当前的出口类似于:

代码语言:javascript
复制
  ORDER PRODUCT STORE OPTIONAL PRICE
  <chr> <chr>   <chr> <chr>    <dbl>
1 ord1  p1      s1    Y            3
2 ord2  p2      s2    N            2
3 ord3  p3      s3    Y            3
4 ord3  p2      s3    N            5
5 ord3  p2      s3    Y            6
6 ord4  p3      s2    Y            1

下面是示例的代码:

代码语言:javascript
复制
data <- tibble("ORDER"=c("ord1","ord2","ord3","ord3","ord3","ord4"),"PRODUCT"=c("p1","p2","p3","p2","p2","p3"),STORE=c("s1","s2","s3","s3","s3","s2"),"OPTIONAL"=c("Y","N","Y","N","Y","Y"),"PRICE"=c(3,2,3,5,6,1))

我的目标是创建一个具有以下内容的数据集:

  • 一种特定的产品(我们有220种不同的产品)
  • 如果cliend要求或不要求一个可选

我设法把桌子旋转起来:

代码语言:javascript
复制
    > data_wide <- data %>% 
+     pivot_wider(names_from = PRODUCT, values_from = PRICE, values_fill = NA ,
+                 values_fn = list(PRICE = sum))

现在我有了这只老虎:

代码语言:javascript
复制
  ORDER STORE OPTIONAL    p1    p2    p3
  <chr> <chr> <chr>    <dbl> <dbl> <dbl>
1 ord1  s1    Y            3    NA    NA
2 ord2  s2    N           NA     2    NA
3 ord3  s3    Y           NA     6     3
4 ord3  s3    N           NA     5    NA
5 ord4  s2    Y           NA    NA     1

我想要创建一个表格,如:

代码语言:javascript
复制
  ORDER STORE OPTIONAL    p1    p2    p3
  <chr> <chr> <chr>    <dbl> <dbl> <dbl>
1 ord1  s1    Y            3    NA    NA
2 ord2  s2    N           NA     2    NA
3 ord3  s3    Y           NA    11     3
4 ord4  s2    Y           NA    NA    NA

对于每一种产品,我都有支付的总价,我知道客户是否要求一个可选的产品(我不在乎哪种产品)。我不知道该如何面对:

  • 我不能丢失有关购买(例如商店)的信息。
  • 我需要一个唯一的订单id,因为我将加入客户机信息数据集

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-07-04 14:27:32

您可以使用dplyrtidyr

代码语言:javascript
复制
library(dplyr)
library(tiydr)

data %>% 
  pivot_wider(names_from="PRODUCT", values_from="PRICE", values_fill=0) %>% 
  mutate(OPTIONAL = OPTIONAL == "Y") %>% 
  group_by(ORDER, STORE) %>% 
  summarise(across(c("OPTIONAL", matches("p\\d+")), ~ sum(.x)), .groups="drop") %>% 
  mutate(OPTIONAL = ifelse(OPTIONAL > 0, "Y", "N"),
         across(matches("p\\d+"), ~na_if(.x,0))) 

返回

代码语言:javascript
复制
# A tibble: 4 x 6
  ORDER STORE OPTIONAL    p1    p2    p3
  <chr> <chr> <chr>    <dbl> <dbl> <dbl>
1 ord1  s1    Y            3    NA    NA
2 ord2  s2    N           NA     2    NA
3 ord3  s3    Y           NA    11     3
4 ord4  s2    Y           NA    NA     1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68245620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档