Ich habe ein Problem mit dem Erstellen einer Spleißstelle für einen gewichteten Index. Ich habe folgende Beispieldaten:Spleißen gewichteten Index
a=(1:10)
b=(14:23)
c=rep(1,10)
wa=c(2,2,2,2,2,6,6,6,6,6)
wb=c(5,5,5,5,5,2,2,2,2,2)
wc=c(3,3,3,3,3,2,2,2,2,2)
z=data.frame(a,b,c,wa,wb,wc)
z$ind=rowSums(z[,1:3]*z[,4:6])/rowSums(z[,4:6])
das die folgenden Datenrahmen zurückgibt:
a b c wa wb wc ind
1 1 14 1 2 5 3 7.5
2 2 15 1 2 5 3 8.2
3 3 16 1 2 5 3 8.9
4 4 17 1 2 5 3 9.6
5 5 18 1 2 5 3 10.3
6 6 19 1 6 2 2 7.6
7 7 20 1 6 2 2 8.4
8 8 21 1 6 2 2 9.2
9 9 22 1 6 2 2 10.0
10 10 23 1 6 2 2 10.8
Die Gewichte (wa, wb, wc) haben sechs an Datensatz geändert. Also würde ich gerne den Index bei Datensatz 6 spleißen, so dass 7.6 zu 11 wird. Ich muss die Werte (a, b, c) mit den Gewichtungen des vorherigen Datensatzes berechnen und diese durch 7.6 dividieren. Wenden Sie das dann auf alle folgenden Zahlen an, bis sich die Gewichte wieder ändern. Die folgende Funktion ermöglicht es mir, wo einer meiner Gewichte zu finden hat sich geändert: Ich
a b c wa wb wc ind test
1 1 14 1 2 5 3 7.5 NA
2 2 15 1 2 5 3 8.2 0
3 3 16 1 2 5 3 8.9 0
4 4 17 1 2 5 3 9.6 0
5 5 18 1 2 5 3 10.3 0
6 6 19 1 6 2 2 7.6 1
7 7 20 1 6 2 2 8.4 0
8 8 21 1 6 2 2 9.2 0
9 9 22 1 6 2 2 10.0 0
10 10 23 1 6 2 2 10.8 0
Jetzt versuchen zu schaffen das:
changeWeight=function(x){
for(i in 2:NROW(z)) {
z$test[i] <- if(z$wa[i]-z$wa[i-1]==0) 0 else 1
}
z
}
Es einen Wert von eins zurückkehren wird, wo das Gewicht wie so verändert hat Wert I multipliziert mit, um den Index bei Rekord sechs zu spleißen. Ich habe versucht, die folgenden:
spliceValue=function(x){
for(i in 2:NROW(z)){
z$splice[i]=if(z$test[i]==1&z$splice[i-1]!=NA) (rowSums(z[i,1:3]*z[i-1,4:6])/rowSums(z[i-1,4:6]))/z$ind[i] else z$splice[i-1]
}
z
}
Aber das gibt diesen Fehler zurück:
Error in if (z$test[i] == 1 & z$splice[i - 1] != NA) z$ind[i - 1]/z$ind[i] else z$splice[i - :
argument is of length zero
Was würde Ich mag diese bekommen:
a b c wa wb wc ind test splice
1 1 14 1 2 5 3 7.5 NA NA
2 2 15 1 2 5 3 8.2 0 0.000000
3 3 16 1 2 5 3 8.9 0 0.000000
4 4 17 1 2 5 3 9.6 0 0.000000
5 5 18 1 2 5 3 10.3 0 0.000000
6 6 19 1 6 2 2 7.6 1 1.447638
7 7 20 1 6 2 2 8.4 0 1.447638
8 8 21 1 6 2 2 9.2 0 1.447638
9 9 22 1 6 2 2 10.0 0 1.447638
10 10 23 1 6 2 2 10.8 0 1.447638
Dann kann ich multiplizieren ind von Spleiß- und haben ein schöner glatter Index.
Seien Sie vorsichtig mit der Funktion 'changeWeight'. In welcher Umgebung erstellen Sie 'z $ test'? In welcher Umgebung möchten Sie es haben? – BenBarnes
Ich hatte meinen Kommentar über 'z $ plice [i-1]' in Ihrer 'spliceValue' Funktion gelöscht, aber das war ein übereiltes Löschen. Definieren Sie eine Spalte in 'z' mit dem Namen' splice', bevor Sie'spliceValue' ausführen, und in Kombination mit dem obigen Kommentar sollten die Dinge reibungsloser verlaufen. – BenBarnes
Wenn der Index mehr als eine Gewichtsänderung hat, gibt es eine Methode, diese richtig zu spleißen [hier] (http://stackoverflow.com/questions/10543199/splicing-weighted-index-and-getting-a-smooth-value) . – thequerist