Как сгруппировать два разных фрейма данных во входные данные функции в R

#r #dplyr

Вопрос:

У меня есть два фрейма данных. Первый фрейм данных содержит информацию о номерах материалов, которая имеет несколько значений. Например:

df1 =

 materialNumber value
  A             10
  A             20
  A             30
  A             40
  B             1
  B             2
  B             43
  C             12 
  C             19
  
 

а затем еще один кадр данных, содержащий только одно значение для того же номера материала, что и в df1.

df2=

 Materialnumber Value
 A               300
 B                13 
 C                18
 

Я пытаюсь определить, являются ли значения во фрейме данных 2 выбросами по сравнению с тем, что находится во фрейме данных 1. Я написал функцию для этого. Однако у меня есть более 10 000 номеров материалов.

Каков наилучший способ сгруппировать номера материалов и запустить их в функцию?

Комментарии:

1. Не могли бы вы поделиться своей функцией обнаружения выбросов? Существуют различные способы выполнения вашей задачи, в зависимости от вашей реализации… вот почему я спрашиваю

2. Я использую варитон обнаружения выбросов Диксона. Вычислите Q , Q = abs(прогнозные значения[которые.мин(abs(значения — прогноз))])/разница(диапазон(значения)), если Q> Q(диксон) , верните номер материала, иначе значение равно нулю.

3. самая сложная часть, по — видимому, заключается в прогнозе-как вы это предсказываете/вычисляете? (поскольку в ваших данных есть только идентификатор группы, все прогнозы для одной группы должны быть одинаковыми… если вы не используете какое-то цепное предсказание)

4. @DPH это из внешнего алгоритма, я пытаюсь определить, имеет ли смысл вывод этого алгоритма(то, что помечено как «прогноз») по отношению к входным данным(то, что помечено как «значения» в Q calc). Я бы не стал слишком беспокоиться об этом по сравнению с тем, чего я пытаюсь достичь.

5. тогда вы, возможно, захотите перефразировать свою проблему: похоже, вы хотите применить пользовательскую формулу к одному df, где при вводе функции используется этот df, а также другой df — правильно? Вы показали оба dfs, но в приведенной формуле используются внешние данные. Структура этого, по-видимому, имеет значение (по одному на группу или по одному на случай, и является ли это df и т. Д.) Для решения. В случае, если прогноз меняется только в зависимости от групп, вы можете просто присоединиться к прогнозу и сравнить…

Ответ №1:

как обсуждалось в чате, здесь следует добавление вашего кода в df1 и df2 без дальнейшей отладки:

 dixon_test_results <- function(materialNumber,forecast){
  EKPO_Values <- df1 %>%
      dplyr::filter(materialNumber == materialNumber) %>%
      dplyr::pull(value)

  Q = abs(forecast-EKPO_Values[which.min(abs(EKPO_Values - forecast))])/diff(range(EKPO_Values))

  print(Q)
  # assumes 95% confidence
  # reference: webspace.ship.edu/pgmarr/…


  dixon_q_table_val <- switch(
  length(EKPO_Values)-1, # assumes that the forecast is now part of the EKPO data set, but values assume n = 3, so  
  length(ekpo) forecast()
  0.9411,
  0.7651,
  0.6423,
  0.5624,
  0.5077,
  0.4673,
  0.4363,
  0.4122,
  0.3922,
  0.3755,
  0.3615,
  0.3496,
  0.3389,
  0.3293,
  0.3208,
  0.3135,
  0.3068,
  0.3005,
  0.2947,
  0.2895,
  0.2851,
  0.2804,
  0.2763,
  0.2725,
  0.2686,
  0.2655,
  0.2622,
  0.2594
  )

  if (Q>dixon_q_table_val) {
      return(materialNumber)
      } else {
      return(NA_charcter_)
  }
}

df2 %>%
    dplyr::mutate(res = dixon_test_results (Materialnumber , Value))