2017-07-20 1 views
1

Ich habe folgende Daten:R Summenwerte in einer Spalte aber ausschließen weniger spezifischer Werte

>str(Maximum) 
num [1:6] 1.4 1.07 1.89 0.342 0.00 1.998 

ich alle diese Werte summieren möchten aber zwischen dem zweiten und dem dritten und dem vierten und fünften, nur die Größerer Wert. In diesem Fall suche ich nach 1,4 + 1,89 + 0,342 + 1,998. Wie würde ich das in R-Code machen?

+0

Kennen Sie die Positionen, die Sie a priori ausschließen möchten? (Dh, werden die übersprungenen Werte immer in diesen Positionen sein?) Oder gibt es eine Regel basierend auf den Werten? – gung

+0

Übersprungene Werte sind immer in diesen Positionen – GR1818

Antwort

4

Erstes Element, plus Maximum von (2,3) plus Maximum von (4,5) + das sechste Element.

maximum[1] + max(maximum[2:3]) + max(maximum[4:5]) + maximum[6] 
+0

Vielen Dank! Das funktioniert perfekt. Wie genau funktioniert dieser Befehl? Es wählt nur den größeren Wert zwischen zwei zugewiesenen Werten? – GR1818

+0

Ja, der Befehl max (...) gibt immer den Wert des höchsten der Werte innerhalb seiner Klammern zurück. – Florian

2

können Sie die Positionen in einem Vektor angeben <vector.name>[<positions>] verwenden. Darüber hinaus können Sie Positionen angeben, die mit - übersprungen werden sollen. So

Maximum <- c(1.4, 1.07, 1.89, 0.342, 0.00, 1.998) 
Maximum[-c(2,5)] 
# [1] 1.400 1.890 0.342 1.998 
sum(Maximum[-c(2,5)]) 
# [1] 5.63 
3

Wenn Ihr Vektor Maximum immer 6 Element hat, ist Florian Antwort der einfachste Weg, es zu tun. Aber wenn Ihr Vektor länger dann könnten Sie tun:

z1 = Maximum[seq(from = 2, to = length(Maximum)-1, by = 2)] 
z2 = Maximum[seq(from = 3, to = length(Maximum)-1, by = 2)] 
z3 = ifelse(z1>z2, z1, z2) 
result = Maximum[1] + sum(z3) + Maximum[length(Maximum)] 

Zum Beispiel:

Maximum = floor(runif(22, 1, 100)) 
> Maximum 
[1] 96 6 1 10 90 15 58 48 94 97 78 95 42 79 61 25 61 74 93 37 44 22 

z1 würden die Elemente sein, sogar bei Indizes (ohne Enden):

> z1 
[1] 6 10 15 48 97 95 79 25 74 37 

z2 die Elemente bei ungeraden Indizes (ohne Enden):

> z2 
[1] 1 90 58 94 78 42 61 61 93 44 

und den Maximalwert zwischen z1 und z2 für jeden Index z3:

> z3 
[1] 6 90 58 94 97 95 79 61 93 44 

Und dann das Ergebnis berechnen durch z3 und den Beginn und das Ende der Maximum

Hinweis hinzugefügt: Die maximale Vektor ein noch haben sollte Anzahl der Elemente.

1

Eine gängige Methode ist hier die Verwendung von tapply, um "Gruppenoperationen" durchzuführen und dann die Zwischenwerte zu aggregieren.

vec <- c(1.4, 1.07, 1.89, 0.342, 0.00, 1.998) 
group <- c(1, 2, 2, 3, 3, 4) 

Hier berechnen Sie die max jeder Gruppe

tapply(vec, group, max) 
    1  2  3  4 
1.400 1.890 0.342 1.998 

Dann können Sie die resultierenden Werte summieren

sum(tapply(vec, group, max)) 
[1] 5.63 

Eine Möglichkeit, die Gruppenvariable zu konstruieren dynamisch rep ein Paar mit würde Zeiten wie diese.

reps <- c(1, rep(2, (length(vec)/2) - 1), 1) 
rep(seq_along(reps), reps) 
[1] 1 2 2 3 3 4 
Verwandte Themen