2016-09-02 7 views
1

ランダムなベクトルを指定して各ビンの合計を求めようとしていますが、コードはベクトルの最初の要素を100として返すだけです。ベクトルの各要素をどのように循環させるでしょうかxの場合、それがビンの範囲であることを確認して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 

所望の出力:

> n 
[1] 7 43 29 13 8 
+1

@ ZheyuanLi私は密度推定器をハードコーディングしています。これはヒストグラム推定器での試みです。私が言及したように、これを行うより簡単な方法があることを認識しましたが、私はその方法を学ぶ試みにおいて、より困難な方法をとっています。 – Vedda

+0

'if'は同じ出力を提供します。私はこれを最初に試してみました: 'if(x [n]> a +(j-1)* h&(x [n] <= a + j * h)} {n [j] < - n [j] + 1 } ' – Vedda

+1

@ ZheyuanLiうん、そうだった。あなたの答えを変えて、私はそれをマークします...ありがとう! – Vedda

答えて

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を使用しただけでなく、カウントを記録するためにも使用されています。以下はnと区別するために、新しいベクトルcountsを使用することによって、これを修正します。

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 

おそらくあなたは、最初の値が67ではないことを指摘しています。これは、ループ条件x[n] > a + (j-1)*h && x[n] <= a + j*hに最初のビンの最小値が含まれていないためです。これが常に当てはまるので、手動で1counts[1]に追加する必要があります。

+1

私は、簡単な間違いに対する完全な答えをありがとう。乾杯! – Vedda

関連する問題