2012-03-26 11 views
1

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.

+0

Seien Sie vorsichtig mit der Funktion 'changeWeight'. In welcher Umgebung erstellen Sie 'z $ test'? In welcher Umgebung möchten Sie es haben? – BenBarnes

+0

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

+0

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

Antwort

1

das Beispiel Expanding mehr als eine Änderung der Gewichte haben:

a=(1:15) 
b=(14:28) 
c=rep(1,15) 
wa=c(2,2,2,2,2,6,6,6,6,6,5,5,5,5,5) 
wb=c(5,5,5,5,5,2,2,2,2,2,6,6,6,6,6) 
wc=c(3,3,3,3,3,2,2,2,2,2,3,3,3,3,3) 
z=data.frame(a,b,c,wa,wb,wc) 
z$ind=rowSums(z[,1:3]*z[,4:6])/rowSums(z[,4:6]) 

Hier habe ich die Funktionen geändert changeWeight() und spliceValue() Vektoren zurückzugeben, die zu den Daten hinzugefügt werden kann. Dies funktioniert wie gewünscht für das erweiterte Beispiel und vermeidet die Umgebungsprobleme, die bei den ursprünglichen Funktionen auftreten können.

Die Bedingung z$splice[i - 1]!=NA schien überflüssig. Wenn nicht, sollten Sie stattdessen !is.na(z$splice[i - 1]) in Betracht ziehen.

spliceValue <- function(x) { 
    splice <- 0 
    for(i in 2:NROW(z)) { 
    splice[i] <- if(z$test[i]==1) (rowSums(z[i,1:3]*z[i-1,4:6])/rowSums(z[i-1,4:6]))/z$ind[i] else splice[i-1] 
    } 
    return(splice) 
} 
z$splice<-spliceValue() 

Und nach dem ursprünglichen Beispiel den ersten Wert von z$splice auf NA zu setzen,

z$splice[1]<-NA 

Als Hinweis, dieser Ansatz kann eine Weile dauern, wenn z viele Zeilen.

Verwandte Themen