R: Использовать значение из другого фрейма данных для сопоставления значений столбцов в строке - PullRequest
0 голосов
/ 11 марта 2019

Я работаю над проектом, для которого я написал R-код.Однако я столкнулся с некоторыми проблемами, пытаясь улучшить время выполнения.

Есть два кадра данных, которые я использую.Следует отметить, что совпадающие наблюдения могут быть найдены в случайных строках.

  • df1 (называемый 'ac') содержит исторические фактические данные спроса со столбцами "Region", "Product", "time" и "ac_qty".
  • df2 (называемый 'fc') содержит прогнозы со столбцами" Region "," Product "," time "и" fc_qty ".

Я хотел бы создатьтретий кадр данных (называемый «er»), который содержит все ошибки (er_qty) для каждой конкретной комбинации «регион / продукт / время».Я преуспел в этом, используя следующий код:

# Examples of data frames 'ac' and 'fc':
ac <- data.frame("Region" = c("R1", "R2", "R3"), 
             "Product" = c("P1", "P2", "P3"), 
             "time" = c(1, 2, 2), 
             "ac_qty" = c(4, 2, 3) )

fc <- data.frame("Region" = c("R2", "R1", "R3"), 
             "Product" = c("P2", "P1", "P3"), 
             "time" = c(2, 1, 2), 
             "fc_qty" = c(2, 1, 3) )

# Copy data frame with forecasts, and expand (separated data frames for later processing)
er <- fc

# Finding corresponding ac_qty for fc_qty with given Region/Product/time:
for (i in 1:length(er$fc_qty)) {
    er$ac_qty[i] <- ac$ac_qty[ac$Region == er$Region[i] & ac$Product== er$Product[i] & ac$time == er$time[i] ]
}

er$er_qty <- er$fc_qty- er$ac_qty

Поскольку цикл for должен перебрать более 200 000 строк во фрейме данных, для вычисления всех значений требуется много времени.Мне нужно существенно сократить время выполнения скрипта.Я попытался использовать функцию with (), но это привело к неверным значениям после проверки.

er$ac_qty<- with(ac, ac_qty[which(Region == er$Region & Product == er$Product & time == er$time)])

Кроме того, приведенный выше код дал мне предупреждение: «длинная длина объекта не кратна короткой длине объекта»

Каков наилучший способ найти значения количеств спроса (ac_qty), которые соответствуют прогнозу (fc_qty), имеющему одинаковую переменную для столбцов Region, Product и time?

Спасибо.

1 Ответ

0 голосов
/ 11 марта 2019

Попробуйте использовать left_join (импорт пакета dplyr),

здесь мы объединяем два фрейма данных на основе их общих столбцов

er <- left_join(ac, fc, by = c("Region", "Product", "time") )

er <- mutate(er, er_qty = fc_qty - ac_qty) %>% select(-fc_qty,-ac_qty)

Во второй строке мы создаем новый столбец, используя mutate, затем используя select, удаляя fc_qty, ac_qty (select не обязателен)

Надеюсь, что это поможет.

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