#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))