如何为 hist 中分布的头部和尾部分配不同的 bin 大小?
How to assign a different bin size to the head and tails of a distribution in hist?
我正在尝试创建一个直方图,我可以在其中根据数据位于分布的头部还是尾部为数据分配不同的 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
函数,但我没有得到任何结果。关于如何 solve/get 解决这个问题有什么建议吗?
我相信你想的太复杂了,你想要的是这个。
my_f2 <- function(x) {
c(seq(min(x), max(x[x < -500]), 5),
seq(-500, 500, 1),
seq(min(x[x > 500]), max(x), 5),
max(x))
}
set.seed(666)
x <- rnorm(1000, 10, 275)
hist(x, my_f2)
但是请注意,最后一个 bin 有点动态,因为 max(x)
没有有效地包含在 seq(min(x[x > 500]), max(x), 5)
中,因此我们必须额外包含它。
我正在尝试创建一个直方图,我可以在其中根据数据位于分布的头部还是尾部为数据分配不同的 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
函数,但我没有得到任何结果。关于如何 solve/get 解决这个问题有什么建议吗?
我相信你想的太复杂了,你想要的是这个。
my_f2 <- function(x) {
c(seq(min(x), max(x[x < -500]), 5),
seq(-500, 500, 1),
seq(min(x[x > 500]), max(x), 5),
max(x))
}
set.seed(666)
x <- rnorm(1000, 10, 275)
hist(x, my_f2)
但是请注意,最后一个 bin 有点动态,因为 max(x)
没有有效地包含在 seq(min(x[x > 500]), max(x), 5)
中,因此我们必须额外包含它。