计算范围内的箱子

时间:2016-09-02 04:37:03

标签: r

我试图找到给定随机向量的每个bin的总和,但代码只返回向量的第一个元素为100.我将如何循环遍历向量中的每个元素{{ 1}},检查它是否为bin x的范围,并返回每个bin的总和?

我意识到在j中有一些功能可以执行此操作,但我正在努力对此特定示例进行硬编码。

R

输出:

# Sample data
set.seed(1234)
x <- rnorm(100)


S <- range(x)
a <- range(x)[1]
b <- range(x)[2]
J <- 5    #bins
h <- (b - a)/J   #interval

for (j in 1:J){
  for (n in 1:length(x)){
    ifelse(x[n] > a + (j-1)*h & (x[n] <= a + j*h), n[j] <- n[j] + 1, n[j] <- n[j] + 0)
  }
}

期望的输出:

> n
[1] 100  NA  NA  NA  NA

1 个答案:

答案 0 :(得分:2)

为什么不使用cuttable

set.seed(1234)
x <- rnorm(100)
bin <- cut(x, breaks = 5)    ## evenly cut `range(x)` into 5 bins
levels(bin)
# [1] "(-2.35,-1.37]"  "(-1.37,-0.388]" "(-0.388,0.591]" "(0.591,1.57]"  
# [5] "(1.57,2.55]" 

table(bin)
# (-2.35,-1.37] (-1.37,-0.388] (-0.388,0.591]   (0.591,1.57]    (1.57,2.55] 
#             7             43             29             13              8

但是,我需要说明你的循环失败的原因。请注意,您不需要ifelse;普通if (...) ...就足够了。错误是您使用n作为循环索引,但也使用它来记录计数!以下通过使用新的向量counts来区分n

来解决此问题
counts <- integer(J)  ## initialization
for (j in 1:J){
  for (n in 1:length(x)) {
    if (x[n] > a + (j-1)*h && x[n] <= a + j*h) counts[j] <- counts[j] + 1L
    }
  }

counts
# [1]  6 43 29 13  7

也许您已注意到第一个值为6而不是7。这是因为您的循环条件x[n] > a + (j-1)*h && x[n] <= a + j*h不包含第一个bin的最低值。由于总是如此,您需要手动将1添加到counts[1]