[英]Dplyr - summarising multiple variables
我的原始数据结构如下:
Article Channel1_qty Channel2_qty Channel3_qty
110 30 10 0
110 40 0 10
111 50 5 2
111 60 3 18
我最终试图生成一个 df,显示每个 channel_qty 售出的服装总和以及文章数量。 使用上面的例子,它看起来像:
Article_count | channel | Sum (total article qty for channel)
2 1 180
2 2 18
2 3 30
我尝试使用以下代码以这种方式构造它,但它不起作用:
df %>%
select(Article,
channel1_qty,
channel2_qty,
channel3_qty) %>%
gather(key = "channel", value = "value", -Article) %>%
group_by(channel)
summarise(
Article_count = n_distinct(Article),
total = sum(value)
)
尝试了一些变化。 如有必要,可以考虑以单独的步骤或循环进行。 不过,我认为 dplyr 中必须有一种更简单/更优雅的方式。 谢谢!
您走在正确的轨道上tidyr::gather()/tidyr::pivot_longer()
,然后是dplyr::group_by()
,最后dplyr::summarize()
。
names_pattern
参数中的正则表达式只是从原始列名中删除了除实际通道号之外的所有内容。
library(tidyverse)
d <- structure(list(Article = c(110L, 110L, 111L, 111L), Channel1_qty = c(30L, 40L, 50L, 60L), Channel2_qty = c(10L, 0L, 5L, 3L), Channel3_qty = c(0L, 10L, 2L, 18L)), class = "data.frame", row.names = c(NA, -4L))
d %>%
pivot_longer(-Article,
names_pattern = "^Channel(.*)_qty",
names_to = "channel",
values_to = "qty") %>%
group_by(channel) %>%
summarize(Article_count = n_distinct(Article),
Sum = sum(qty))
#> # A tibble: 3 × 3
#> channel Article_count Sum
#> <chr> <int> <int>
#> 1 1 2 180
#> 2 2 2 18
#> 3 3 2 30
由reprex package (v2.0.1) 于 2022 年 8 月 4 日创建
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.