簡體   English   中英

將功能應用於R數據幀的每個組和列

[英]Applying function to each group and column of R dataframe

我需要應用此功能

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應用於每個類別以及每個列。 如何實現呢?

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

group_by使用mutate_all

library(dplyr)

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

考慮帶有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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM