如何为hist的分布的头和尾分配不同的bin大小?

问题描述

我正在尝试创建一个直方图,可以根据它们位于分布的头部还是尾部来为数据分配不同的bin大小。

我试图创建以下函数my_f用作自变量breaks=的输入,但是它不起作用。这是我的代码,以及我得到的错误

x <- rnorm(1000,10,275)
my_f <- function(x){
  loc <- list(x[x < -500],x[x >= -500 & x <= 500],x[x > 500])
  dx <- c(5,1,5)
  breaks <- sapply(1:length(x),function(i) if(x[i] %in% loc[[1]])
     {seq(min(loc[[1]]),max(loc[[1]])+dx[1],dx[1])} else
       if(x[i] %in% loc[[2]]){seq(min(loc[[2]]),max(loc[[2]])+dx[2],dx[2])} else
         {seq(min(loc[[3]]),max(loc[[3]])+dx[3],dx[3])})
  return(breaks)
}

h <- hist(x,breaks = my_f)

Error in hist.default(x,breaks = my_f,plot = F) : 
  c("Invalid breakpoints produced by 'breaks(x)': 200.1702,210.1702,....

我也尝试了不使用sapply函数的情况,但是我什么都没得到。关于如何解决/解决此问题的任何建议?

解决方法

我相信您在想的太复杂了,这就是您想要的。

my_f2 <- function(x) {
  c(seq(min(x),max(x[x < -500]),5),seq(-500,500,1),seq(min(x[x > 500]),max(x),max(x))
}

set.seed(666)
x <- rnorm(1000,10,275)
hist(x,my_f2)

enter image description here

但是请注意,最后一个bin有点动态,因为max(x)没有有效地包含在seq(min(x[x > 500]),5)中,因此我们必须额外添加它。