Сопоставление интервалов со значениями в другой таблице в R - PullRequest
1 голос
/ 26 сентября 2019

В настоящее время у меня есть один 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
} 

Это пятнадцать раз, используя соответствующие цены таблицы цен.Я бы хотел более эффективное решение.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Используя данные, воспроизводимые в примечании в конце, сформируйте вектор точек среза (т.е. первое число в каждом интервале) и затем используйте 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

Примечание

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

dfprice <- data.frame(wgt_intvl = c("0-15", "15-25", "25-50"), 
 price = c(50, 75, 135), stringsAsFactors = FALSE)
0 голосов
/ 26 сентября 2019

Вместо оператора if вы можете использовать более эффективную операцию case_when:

library(dplyr)
 df %>%
mutate(cost = case_when(
    wgt < 15 ~ 50,
    wgt > 15 & wgt <25 ~ 75,
    TRUE ~ 135))

В качестве альтернативы вы можете использовать cut() для преобразования wgt в wgt_intvl и сопоставления через left_join().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...