首页 > 解决方案 > 将区间与 R 中另一个表中的值匹配

问题描述

目前,我有一个 df 和一个价格表。

Order Number  wgt           wgt_intvl        price
-------------------         ---------------  -----
 01            22           0-15             50
 02            5            15-25            75
 03            35           25-50            135

我想要的是将df中的权重匹配到R中价格表的区间。例如,第一个订单(Order Number 01)对应的价格为75。因此,我想在第一个df中添加一列,说df$cost对应于根据wgt_intvl价格表中的适当价格。

我认为这样做的方式是使用if-else声明,但这是非常低效的,我想知道是否有更好的方法来做到这一点。实际上,这些表格要长得多——价格或重量区间没有逻辑上的“积累”。我在这张表中有 15 个重量区间。我当前的解决方案如下所示:

If(wgt < 15){
  df$cost <- 50
} else if (wgt > 15 & wgt < 25){ 
  df$cost <- 75
} else if(wgt > 25 & wgt < 50){ 
  df$cost <- 135
} 

这乘以十五,使用价格表的相应价格。我想要一个更有效的解决方案。提前致谢!

标签: rdataframeintervals

解决方案


使用末尾注释中可重现的数据,形成切点向量(即每个区间的第一个数字),然后使用findInterval找到与权重对应的区间。

cutpoints <- as.numeric(sub("-.*", "", dfprice$wgt_intvl))
transform(dfmain, price = dfprice$price[findInterval(wgt, cutpoints)])

给予:

  Order wgt price
1    01  22    75
2    02   5    50
3    03  35   135
4    04  25   135

笔记

dfmain <- data.frame(Order = c("01", "02", "03", "04"), wgt = c(22, 5, 35, 25), 
 stringsAsFactors = FALSE)

dfprice <- data.frame(wgt_intvl = c("0-15", "15-25", "25-50"), 
 price = c(50, 75, 135), stringsAsFactors = FALSE)

推荐阅读