我有按年份和副產品劃分的銷售資料,可以這樣說:
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)
我想要按年份識別 TOP 2 產品并將所有其余產品匯總為“其他”類別的代碼。
uj5u.com熱心網友回復:
我們可以arrange按'Year'和'Sale'desc結束順序,然后在按'Year'分組后根據row_number更改'Model'的值
library(dplyr)
df %>%
arrange(Year, desc(Sale)) %>%
group_by(Year) %>%
mutate(Model = case_when(row_number() > 2~ 'other', TRUE ~ Model)) %>%
ungroup
或者另一種選擇是使用slice_max(with_ties = TRUE默認情況下)
df %>%
group_by(Year) %>%
mutate(Model =case_when(Model %in% {cur_data() %>%
slice_max(n = 2, order_by = Sale) %>%
pull(Model)} ~ Model, TRUE ~ "other" )
)
uj5u.com熱心網友回復:
類似于 akrun 的解決方案: Slighlty 其他策略:
library(dplyr)
df %>%
type.convert(as.is = TRUE) %>%
group_by(Year) %>%
arrange(desc(Sale), .by_group = TRUE) %>%
mutate(Model = ifelse(Model == first(Model, 2), Model, "Other"))
# Groups: Year [3]
Year Model Sale
<int> <chr> <int>
1 2010 b 45
2 2010 d 33
3 2010 Other 30
4 2010 Other 24
5 2010 Other 23
6 2011 b 56
7 2011 e 56
8 2011 Other 45
9 2011 Other 19
10 2011 Other 11
11 2012 c 89
12 2012 a 33
13 2012 Other 33
14 2012 Other 32
15 2012 Other 12
uj5u.com熱心網友回復:
另一種可能的解決方案(盡管我不確定 OP 是在尋找輸出作為我的答案之一還是作為其他答案之一):
library(tidyverse)
df %>%
group_by(Year) %>%
mutate(top = dense_rank(desc(Sale)) %>% as.character,
top = if_else(top %in% c("1", "2"), top, "Other")) %>%
ungroup
#> # A tibble: 15 × 4
#> Year Model Sale top
#> <dbl> <chr> <chr> <chr>
#> 1 2010 a 30 Other
#> 2 2010 b 45 1
#> 3 2010 c 23 Other
#> 4 2010 d 33 2
#> 5 2010 e 24 Other
#> 6 2011 a 11 Other
#> 7 2011 b 56 1
#> 8 2011 c 19 Other
#> 9 2011 d 45 2
#> 10 2011 e 56 1
#> 11 2012 a 33 2
#> 12 2012 b 32 Other
#> 13 2012 c 89 1
#> 14 2012 d 33 2
#> 15 2012 e 12 Other
uj5u.com熱心網友回復:
您可以使用fct_lump_n()從forcats折疊級別,但首先您需要uncount您的資料。
library(dplyr)
library(tidyr)
library(forcats)
df |>
mutate(Sale = as.integer(Sale)) |>
uncount(Sale) |>
group_by(Year) |>
mutate(Model = fct_lump_n(Model, n = 2)) |>
count(Model)
輸出
#> # A tibble: 10 x 3
#> # Groups: Year [3]
#> Year Model n
#> <dbl> <fct> <int>
#> 1 2010 b 45
#> 2 2010 d 33
#> 3 2010 Other 77
#> 4 2011 b 56
#> 5 2011 Other 75
#> 6 2011 e 56
#> 7 2012 d 33
#> 8 2012 Other 44
#> 9 2012 a 33
#> 10 2012 c 89
(不知道為什么 2012 年保留 4 個組而不是 3 個)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/458756.html
上一篇:Pandas:將資料框重構為列值
