2016-09-02 5 views
1

Ich versuche, die Summe der einzelnen Bin mit einem zufälligen Vektor zu finden, aber der Code gibt nur das erste Element des Vektors als 100 zurück. Wie würde ich durch jedes der Elemente im Vektor durchlaufen x, überprüfen, ob es sich um den Bereich j handelt, und die Summe für jeden Behälter zurückgeben?Rechenbereiche in Bins

Ich weiß, es gibt Funktionen, dies in R zu tun, aber ich arbeite an der harten Codierung dieses spezifische Beispiel.

# 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) 
    } 
} 

Ausgang:

> n 
[1] 100 NA NA NA NA 

gewünschte Ausgabe:

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

@ZheyuanLi Ich arbeite an der harten Kodierung eines Dichteschätzers und dies ist ein Versuch an einem Histogrammschätzer. Wie ich bereits erwähnt habe, habe ich gemerkt, dass es einfachere Wege gibt, dies zu tun, aber ich bin auf eine härtere Art und Weise, Dinge zu tun, um die Methode zu lernen. – Vedda

+0

'if' liefert die gleiche Ausgabe. Ich habe das ursprünglich versucht: 'if (x [n]> a + (j-1) * h & (x [n] <= a + j * h)) {n [j] <- n [j] + 1 } ' – Vedda

+1

@ZheyuanLi Yup, das war es. Ändern Sie Ihre Antwort und ich werde es markieren ... Danke! – Vedda

Antwort

2

Warum nicht verwenden cut und 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 

Dennoch muss ich zeigen, warum Ihre Schleife ausfällt. Beachten Sie, dass Sie keine ifelse benötigen; gewöhnliche if (...) ... ist ausreichend. Der Fehler ist, dass Sie n als Loop-Index verwendet haben, aber es auch verwenden, um Zählungen aufzuzeichnen! Die folgende korrigiert dies, indem Sie einen neuen Vektor counts Verwendung mit n zu unterscheiden:

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 

Vielleicht haben Sie bemerkt, dass der erste Wert 6 nicht 7. Dies liegt daran, dass Ihre Schleifenbedingung x[n] > a + (j-1)*h && x[n] <= a + j*h nicht den niedrigsten Wert für die erste Bin enthält. Da dies immer der Fall ist, müssen Sie 1 manuell zu counts[1] hinzufügen.

+1

Vielen Dank für Ihre gründliche Antwort auf einen einfachen Fehler meinerseits. Prost! – Vedda

Verwandte Themen