我有一个数据框df
,如下所示(样本易于询问):
ID Sales
10001 214108
10002 207858
10003 76548
10004 68361
10005 56456
我需要对df
进行分组,以便生成的行包含总销售额的90%。我遇到了这个approach,但我没有得到理想的结果。我使用的是以下内容:
subset(df, Sales >= quantile(Sales,0.9))
我得到的是以下内容:
>ID Sales
<dbl> <dbl>
1 10001 214108
我目前的想法是按照以下方式进行:
df$Sales_pct = Sales/sum(Sales)
df
列值Sales_pct
但是,我觉得应该有更好的方法。有人可以帮忙吗?
答案 0 :(得分:1)
使用R base方法:
#1.Add a new column using: df$Sales_pct = Sales/sum(Sales)
df$Sales_pct <- with(df, Sales/sum(Sales))
#2.Sort df in descending order of Sales_pct column values
df <- df[order(df$Sales_pct, decreasing = TRUE), ]
#3.Add another column with cumulative percentage and then subset rows that have
# the cumulative percentage value less than 0.9
df$Sales_cum <- cumsum(df$Sales_pct)
subset(df, Sales_cum < .90)
ID Sales Sales_pct Sales_cum
1 10001 214108 0.3434901 0.3434901
2 10002 207858 0.3334633 0.6769533
3 10003 76548 0.1228047 0.7997581
tidyverse
方法
df %>% mutate(Sales_pct = Sales/sum(Sales)) %>%
arrange(-Sales_pct) %>%
mutate(Sales_cum = cumsum(Sales_pct)) %>%
filter(Sales_cum <= 0.90)