我有按年份和副產品劃分的銷售資料,可以這樣說:
Year <- c(2010,2010,2010,2010,2010,2011,2011,2011,2011,2011,2012,2012,2012,2012,2012)
Model <- c("a","b","c","d","e","a","b","c","d","e","a","b","c","d","e")
Sale <- c("30","45","23","33","24","11","56","19","45","56","33","32","89","33","12")
df <- data.frame(Year, Model, Sale)
產品年份:
a= 30 11 33 = 74 b= 45 56 32 = 133 c= 23 19 89 = 131 d= 33 45 33 = 111 e= 12 56 24 = 92
根據這 3 年內的總銷售額排名:
1 2 3 4 5
b c d e a
我想要按年份標識 TOP 2 產品(根據這 3 年內的總銷售額)并將所有其余產品匯總為“其他”類別的代碼。所以輸出應該是這樣的:
year Model Sale 2010 b 45 2010 c 23 2010 other 30 33 24=92 2011 b 56 2011 c 19 2011 other 11 45 56=112 2012 b 32 2012 c 89 2012 other 33 33 12= 78
uj5u.com熱心網友回復:
一個整潔的解決方案。您的Sale資料似乎以字符形式存盤,這意味著我們必須as.numeric在對它們求和之前使用。
library(tidyverse)
df %>%
group_by(Model) %>%
mutate(
Sale = as.numeric(Sale),
total_sale = sum(Sale)
) %>%
ungroup %>%
mutate(
model_condensed = ifelse(total_sale %in% rev(sort(unique(total_sale)))[1:2], Model, 'other')
) %>%
group_by(Year, model_condensed) %>%
summarize(Sale = sum(Sale))
Year model_condensed Sale
<dbl> <chr> <dbl>
1 2010 b 45
2 2010 c 23
3 2010 other 87
4 2011 b 56
5 2011 c 19
6 2011 other 112
7 2012 b 32
8 2012 c 89
9 2012 other 78
上述解決方案通過匹配 中的值來創建“其他”類別Sale。如果這些值有小數位,這可能會導致問題(請參閱此問題)。相反,我們可以使用兩步程序來按名稱識別前兩個模型,并使用它來為總資料創建分組:
totals <- df %>%
group_by(Model) %>%
summarize(total_sale = sum(as.numeric(Sale))) %>%
arrange(desc(total_sale)) %>%
slice_head(n = 2)
df %>%
group_by(Year, model_condensed = ifelse(Model %in% totals$Model, Model, 'other')) %>%
summarize(Sale = sum(as.numeric(Sale)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/458761.html
