我想绘制一个直方图,其中的桶由以下内容指定:
• 4.25 ≤ E < 4.75
• 4.75 ≤ E < 4.90
• 4.90 ≤ E ≤ 5.10
• 5.10 < E < 5.25
• 5.25 ≤ E ≤ 5.75
注意左右边界之间的相等性如何跳跃。我怎么能在代码中做到这一点?
答案 0 :(得分:1)
据我所知,基础R中没有切割/断开功能,允许您指定这样的不规则断点。您可以将findInterval
包裹起来进行一些操作
findInterval2 <- function(x, br, rightmost.closed = FALSE, left.closed=TRUE,
trim=FALSE, labels=NULL) {
r <- findInterval(x, br, rightmost.closed)
closed.left <- c(rep_len(left.closed, length(br)), rightmost.closed)
m <- x %in% br
slideright <- m & r==0 & !left.closed[1]
r[slideright] <- r[slideright] + 1
slideleft <- which(m & r!=0 & !left.closed[ifelse(r==0,NA,r)])
r[slideleft] <- r[slideleft]-1
rng <- 0:length(br)
if(trim) {
r[r<1 | r>length(br)-1] <- NA
rng <- 1:(length(br)-1)
}
if (is.null(labels) || (is.logical(labels) && labels==TRUE)) {
ff <- format(embed(br,2))
labels <- paste0(
ifelse(left.closed, "[","("),
ff[,2], ", ", ff[,1],
ifelse(c(left.closed[-1], rightmost.closed), ")","]")
)
if(!trim) {
labels <- c(
paste0("(-Inf,", ff[1,2], ifelse(left.closed[1], ")","]") ),
labels,
paste0( ifelse(rightmost.closed, "[","("), ff[nrow(ff),1], ", Inf)" )
)
}
} else if (is.logical(labels) && labels==FALSE) {
labels = NULL
}
if (!is.null(labels)) {
r <- factor(r, levels=rng, labels=labels)
}
r
}
使用中断br<-c(4.25 ,4.75, 4.90,5.10, 5.25, 5.75)
列表,findInterval
的正常行为会创建中断/标签
-inf < x < 4.25
:0 4.25 <= x < 4.75
:1 4.75 <= x < 4.90
:2 4.90 <= x < 5.10
:3 5.10 <= x < 5.25
:4 5.25 <= x < 5.75
:5 x>=5.75
:6 但是,如果我们添加新参数left.closed
,我们指定是否应将中断值对指定的每个区域保持关闭(默认值)或右侧关闭。该向量的长度应小于断开向量的长度。
我们可以通过
获得您想要的休息时间rr <- findInterval2(x, br, rightmost.closed=FALSE,
left.closed=c(T, T, T, F, T), trim=TRUE)
应创建
4.25 <= E < 4.75
:1 4.75 <= E < 4.90
:2 4.90 <= E <= 5.10
:3 5.10 < E < 5.25
:4 5.25 <= E <= 5.75
:5 请注意,测试与数字(十进制)值完全匹配的是very messy。因此,使用连续数据执行此操作可能存在缺陷。
另请注意,这并不一定直接适用于直方图。如果您想要显示数据,此函数可用于分箱,然后创建barplot
。直方图实际上只是用于估计连续随机变量的基础密度,如果对断点进行这种挑剔,看起来您的数据可能更加离散,而您对计数而不是密度感兴趣。
例如,我们可以使用
创建测试数据set.seed(15)
br <- c(4.25,4.75, 4.90, 5.10, 5.25, 5.75)
x <- runif(45, min(br), max(br))
rr <- findInterval2(x, br, rightmost.closed=FALSE,
left.closed=c(T, T, T, F, T), trim=TRUE)
barplot(table(rr))