绘制具有不同约束相等性的直方图

时间:2014-09-17 16:03:22

标签: r histogram

我想绘制一个直方图,其中的桶由以下内容指定:

• 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

注意左右边界之间的相等性如何跳跃。我怎么能在代码中做到这一点?

1 个答案:

答案 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))

enter image description here