2017-06-29 4 views
0

Ich möchte einen normalisierten Vektor separat in zwei Richtungen in R.Summe normierten Vektor getrennt in zwei Richtungen

Zum Beispiel für einen Vektor 3,4,5,6,10,9,8,7 nach Normierung 0.3, 0.4, 0.5, 0.6, 1.0, 0.9, 0.8, 07. Ich möchte die Werte < 1 links und rechts getrennt summieren und ihren Unterschied finden. In diesem Fall bleibt übrig = 0,3 + 0,4 + 0,5 + 0,6 = 1,8, rechts = 0,9 + 0,8 + 0,7 = 2,4. Der Unterschied ist rechts minus links gleich 0,6.

Im Folgenden sind einige meiner Gedanken:

a <- c(3,4,5,6,10,9,8,7) 
norm <- a/max(a) # normalization 
left <- sum(a[1:which.max(a)-1]) # left sum 
right <- sum(a[which.max(a)+1:length(a)]) # right sum 
diff <- right-left 

Irgendwelche Vorschläge für Verbesserungen?

+0

Vielleicht 'Reduce ('-', tapply (Norm, Cumsum (c (WAHR, (a == max (a)) [- 1])), FUN = Summe)) ' – akrun

+0

Ich bekomme' 1.8' durch Summierung '0.3 + 0.4 + 0.5 + 0.6 # [1 ] 1.8' – akrun

+0

guter Fund für meinen Mathefehler. Haha. – Jian

Antwort

0

Wir können rleid verwenden, um die Gruppenvariable zu erhalten, erhalten die sum der 'Norm' für jede Gruppe ('ind') und erhalten die Differenz

library(data.table) 
ind <- rleid(norm<1) 
diff(as.numeric(tapply(norm[ind!=2], ind[ind!=2], FUN = sum))) 
#[1] 0.6 
Verwandte Themen