【发布时间】:2017-07-01 01:09:17
【问题描述】:
我正在尝试使用 by 函数根据组变量替换数据框中许多变量的异常值。
以下是我的努力。但是,我得到一个错误。
# R code:
library(tidyverse)
library(dplyr)
# outlier function definition
my_outlier <- function(x){
stats <- boxplot.stats(unlist(x))
outlier <- stats$out
outlier_idx <- which(unlist(x) %in% outlier)
max <- max(x[-outlier_idx]); min <- min(x[-outlier_idx])
x <- ifelse(x>max, max,ifelse(x < min, min, x) )
return(x)
}
# use the above defined func to substitue outliers of 1 variable in a dataframe, according to a Group variable.
group_data <- as_tibble(data.frame(x=c(runif(10),2.5,-2.3,runif(10,1,2),3.5,-1.5), group=c(rep(1,12),rep(2,12)) ) )
View(group_data)
by(group_data$x, group_data$group, my_outlier, simplify=FALSE)
# use the above defined func to substitue outliers of 1+ variable in a dataframe, according to a Group variable.
group_datas <- as_tibble(data.frame(x=c(runif(10),2.5,-2.3,runif(10,1,2),3.5,-1.5),
y=c(runif(10,2,3),4,-1,runif(10,3,4),6,-1),
group=c(rep(1,12),rep(2,12)) ) )
by(group_data[,1:2], group_data$group, my_outlier)
当使用我定义的函数替换数据框中 1+ 变量的异常值时,根据 Group 变量,我得到了一个错误。
我不知道我的代码的哪一部分导致了错误。
【问题讨论】:
-
您缺少列索引,您要计算
max <- max(x[-outlier_idx]); min <- min(x[-outlier_idx])中的最大值。如果要考虑包括组列在内的整个矩阵,则需要在outlier_idx之后添加逗号作为max <- max(x[-outlier_idx,]); min <- min(x[-outlier_idx,])。还要注意ifelse只返回标量而不是向量。