将功能应用于R数据帧的每个组和列

时间:2018-08-28 19:01:26

标签: r dplyr grouping

我需要应用此功能

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 :(得分:3)

您可以使用软件包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)

答案 1 :(得分:2)

mutate_all中使用group_by

library(dplyr)

DF %>% 
  group_by(Category) %>%
  mutate_all(replace_outliers) %>%
  ungroup

答案 2 :(得分:1)

考虑将base Rby(按类别进行拆分),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))