Как использовать функцию выброса IQR на основе ключа в R - PullRequest
0 голосов
/ 27 июня 2018

Я хочу использовать эту функцию IQR:

    smooth_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.3 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- round(qnt[1] - H)
  y[x > (qnt[2] + H)] <- round(qnt[2] + H)
  y
}

в нижнем df, в столбце total для каждого конкретного ключа на основе столбца key:

    key total
US4ZNB  10
US4ZNB  1075
US4ZNB  10000
US4ZNB  1138
US4ZNB  1156
US4YYM  1114
US4YYM  1072
US4YYM  50
US4YYM  1181
US4YYM  8000
JM4YYM  15000
JM4YYM  2000
JM4YYM  100
JM4YYM  2200
JM4YYM  2300

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

После разработки идей мне удается найти решение для моей проблемы. Я просто использовал dplyr::group_by:

df.new <- df %>% group_by(key) %>% mutate(val=smooth_outliers(total))

Спасибо вам всем.

0 голосов
/ 27 июня 2018

ddply из пакета plyr делает именно это. Он применяет функцию к каждому подмножеству данных на основе столбца.

plyr::ddply(df, "key", plyr::numcolwise(smooth_outliers))

Первый аргумент - это ваши данные с «ключом» и «итогом», второй аргумент - это переменная группировки, в данном случае «ключ».

Последняя переменная - это функция, которую вы хотите применить, здесь используется в основном функция numcolwise, поэтому она применяется к столбцу, а не ко всей строке. Поэтому мы делаем функцию сглаживания на основе строк функцией на основе столбцов.

Тогда вуаля.

Вы получите кадр данных, в котором перечислены каждый ключ и его IQR, рассчитанный с помощью функции smooth_outliers.

Вот результат.

      key total
1  JM4YYM  1421
2  JM4YYM  1712
3  JM4YYM  1709
4  US4YYM  1114
5  US4YYM  1473
6  US4YYM  1181
7  US4YYM  1767
8  US4YYM  1005
9  US4ZAW  1138
10 US4ZAW  1156
11 US4ZAW  1982
12 US4ZNB  1338
13 US4ZNB  1075
14 US4ZNB  1806

Как видите, каждая клавиша сопоставляется с одним из выходов функции smooth_outliers.

...