繁体   English   中英

基于列总值的比例的子集R数据帧

[英]Subset R dataframe based on proportion of total column value

我有一个如下所示的数据框df (为便于询问,提供了示例):

ID       Sales
10001   214108 
10002   207858
10003    76548
10004    68361
10005    56456

我需要对df进行子集处理,以使结果行包含总销售额的90%。 我遇到了这种方法 ,但是没有得到理想的结果。 我使用的是以下内容:

subset(df, Sales >= quantile(Sales,0.9))

我得到的是以下内容:

     >ID  Sales
     <dbl>  <dbl>
  1 10001 214108

我当前的想法是通过以下方式进行操作:

  1. 使用以下方法添加新列: df$Sales_pct = Sales/sum(Sales)
  2. Sales_pct列值的降序对df进行排序
  3. 添加具有累积百分比的另一列,然后添加累积百分比值小于0.9的子集行

但是,我觉得应该有一个更好的方法。 有人可以帮忙吗?

使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM