这是一种可能性:
library(ggplot2)
n <- 1000
df <- data.frame(x=rnorm(n), y=rnorm(n),
label=sample(letters[1:4], size=n,
replace=TRUE))
df$y[1:50] <- 50 # Add some outliers
## Similar to your plot
ggplot(df, aes(x, y)) + geom_point() + facet_wrap(~ label)
library(plyr)
df.quantiles <- ddply(df, "label", summarise,
q99=quantile(y, probs=0.99),
q90=quantile(y, probs=0.90))
df <- merge(df, df.quantiles, by="label", all.x=TRUE)
## More or less what you want?
ggplot(df[df$y < df$q99, ],
aes(x, y)) + geom_point() + facet_wrap(~ label)
这假设上面只有异常值,但您可以轻松地将其扩展为在下面执行相同的操作。
你可以尝试一些更复杂的东西,也许
df[df$y < df$q99 | (df$q99 / df$q90) < some.ratio, ]
您选择 some.ratio 以便只在 Y 被认为是异常值时丢弃最大的 1%,而不是一直丢弃。
希望有帮助。