我试图找到给定随机向量的每个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
答案 0 :(得分:2)
为什么不使用cut
和table
?
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]
。