Применение функции к каждой группе и столбцу данных R - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно применить эту функцию

replace_outliers <- function(column) {
  qnt <- quantile(column, probs=c(.25, .75))
  upper_whisker <- 1.5 * IQR(column)
  clean_data <- column
  clean_data[column > (qnt[2] + upper_whisker)] <- median(column)
  clean_data
}

к набору данных, который выглядит следующим образом:

  Category       a       b       c
       a       2.0     5.0    -5.0
       a       1.5    10.0    10.0
       b       3.2    14.5   100.2
     ...       ...     ...     ...

Я должен применить replace_outliers к каждой категории отдельно и для каждого столбца. Как этого добиться?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Использование mutate_all в пределах group_by:

library(dplyr)

DF %>% 
  group_by(Category) %>%
  mutate_all(replace_outliers) %>%
  ungroup
0 голосов
/ 28 августа 2018

Рассмотрим base R с by (для разделения на категорию ), sapply (для вызова функции) и do.call для связывания всех групп вместе:

df_list <- by(data, data$category, function(sub) {
  sub[-1] <- sapply(sub[-1], replace_outliers)
  sub
})

final_df <- do.call(rbind, unname(df_list))
0 голосов
/ 28 августа 2018

Вы можете использовать пакет dplyr. Используйте group_by, чтобы сделать это для каждой категории, и mutate_if, чтобы применить функцию ко всем числовым столбцам

.
library(dplyr)
df <- read.table(header = TRUE, text = 
                   " Category       a       b       c
       a       2.0     5.0    -5.0
                 a       1.5    10.0    10.0
                 b       3.2    14.5   100.2")
replace_outliers <- function(column) {
  qnt <- quantile(column, probs=c(.25, .75))
  upper_whisker <- 1.5 * IQR(column)
  clean_data <- column
  clean_data[column > (qnt[2] + upper_whisker)] <- median(column)
  clean_data
}

df %>% group_by(Category) %>% 
  mutate_if(is.numeric, replace_outliers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...