【问题标题】:How to find the sum of the 2nd quartile based on a condition in R如何根据R中的条件找到第二个四分位数的总和
【发布时间】:2016-12-09 23:13:34
【问题描述】:

在此示例中,我拥有的数据表示销售额及其与给定商店 OneTwo 的距离 (Dist)。我想做的是,根据销售量来定义商店服务区域。区域定义为包含 50% 销售额的半径。从与商店距离最短 (Dist) 的订单开始,我想计算包含给定商店销售额 50% 的半径。

以下df 是我在以前的模型中计算出来的。

df <- data.frame(ID = c(1,2,3,4,5,6,7,8),
                 Store = c('One','One','One','One','Two','Two','Two','Two'),
                 Dist = c(1,5,7,23,1,9,9,23),
                 Sales = c(10,8,4,1,11,9,4,2))

现在我想找到dist 的最小距离,它使接近数字为Sales 的 50%。所以我的输出如下:

Output <- data.frame(Store = c('One','Two'),
                 Dist = c(5,9),
                 Sales = c(18,20))

我在我的实际 df 中有很多观察结果,而且我无法准确地解决 50%,所以我需要四舍五入到最近的观察结果。

有什么建议吗?

注意:我提前为这个糟糕的标题道歉,我试图想一个更好的方法来解决这个问题,欢迎提出建议......

【问题讨论】:

  • 我不太清楚你的目标,你能详细说明一下吗?
  • 您能否详细说明产生预期结果的算法?
  • @nrussell 我已经就目标提供了额外的说明。让我知道这是否更清楚。
  • @RomanLuštrik 我在问题开始时添加了附加说明。我正在使用 Haversine Distance 来计算订单到商店的距离,现在想找到具有给定销售密度的集水区。即 50% 的销售额在 20K 范围内
  • 当您说“销售额的50%”时,您的意思是给定商店销售额的50%,对吗?

标签: r optimization mathematical-optimization


【解决方案1】:

这是data.table 的一种方法:

library(data.table)
setDT(df)

df[order(Store, Dist), 
   .(Dist, Sales = cumsum(Sales), Pct = cumsum(Sales) / sum(Sales)),
   by = "Store"][Pct >= 0.5, .SD[1,], by = "Store"]
#    Store Dist Sales       Pct
# 1:   One    5    18 0.7826087
# 2:   Two    9    20 0.7692308 

  • setDT(df)df 转换为data.table
  • .(...) 表达式选择Dist,并通过Store 计算累计销售额和各自累计销售额百分比
  • Pct &gt;= 0.5 仅将其子集到仅累积销售额超过阈值的情况,.SD[1,] 仅取顶行(即Dist 的最小值),Store

【讨论】:

    【解决方案2】:

    我认为如果您以某种格式重新排列数据会更容易。我的逻辑是首先按组获取cumsum。然后将组的总和合并到数据中。最后我计算百分比。现在您已经获得了数据,您可以以任何您想从组中获取第一个 obs 的方式进行子集化。

    df$cums=unlist(lapply(split(df$Sales, df$Store), cumsum), use.names = F)
    zz=aggregate(df$Sales, by = list(df$Store), sum)
    names(zz)=c('Store', 'TotSale')
    df = merge(df, zz)
    df$perc=df$cums/df$TotSale
    

    子设置数据:

    merge(aggregate(perc ~ Store,data=subset(df,perc>=0.5), min),df)
     Store      perc ID Dist Sales cums TotSale
    1   One 0.7826087  2    5     8   18      23
    2   Two 0.7692308  6    9     9   20      26
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 2019-01-28
      • 1970-01-01
      • 2016-08-30
      • 2013-10-04
      • 2019-09-20
      相关资源
      最近更新 更多