2017-01-24 3 views
3

I einen Vektor von unterschiedlichen Werten, und ich möchte zwei Werte miteinander verschmelzen und fügen, wenn ein 5 durch eine 3. folgtMerging zwei aufeinanderfolgende Werte

Input:

vector <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 

Erwartete Ausgangs :

1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8 

so wie Sie die beiden Vorkommen eines drei folgenden 5 addiert 8 zeigen sehen können, wurden ich bin sicher, dass es eine einfache Funktion, die in einer Angelegenheit von Sekunden tun dies, Ich war einfach nicht fähig, es zu finden.

Vielen Dank im Voraus! Hier

Antwort

9
vector <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 

# get indices where 5 followed by 3 
fives <- head(vector, -1) == 5 & tail(vector, -1) == 3 

# add three to fives 
vector[fives] <- vector[fives] + 3 

# remove threes 
vector <- vector[c(TRUE, !fives)] 
vector 
# [1] 1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8 
+0

Könnte dies auch für einen Datenrahmen verwendet werden? Ich habe einen Datenrahmen mit 9 Spalten und ungefähr 10.000 Reihen, und ich möchte zwei Reihen zusammen zusammenführen, wenn eine Spalte eine 5 enthält, gefolgt von einem 3 – useR

+0

Möchten Sie dieses auf jede Spalte separat anwenden oder dieses auf alle Spalten anwenden basierend auf einer einzigen Spalte? Vielleicht können Sie ein expliziteres Beispiel geben. – Psidom

+0

Die wichtigsten Spalten sind ID, Matchtime, Scoreevent und accumulatedscore. Scoreevent enthält verschiedene Zahlen von -9 bis 9. Der akkumulierte Score akkumuliert den Score, bis sich die ID ändert, dann werden sowohl Scoreevent als auch Accumulated Score auf Null zurückgesetzt. Was ich tun möchte, ist, wenn eine 5 in der Spalte Scoreevent eine 2 folgt, würde es die beiden entsprechenden Zeilen zusammenführen. Also sagen, wenn die Reihe mit den 5 123 in ID, 2053 in Matchtime, 5 in Scoreevent und 17 in kumulativeScore hatte und die Reihe mit den 3 hatte 123 ID, 2117 in Matchtime, 3 in Scoreevent und 20 in kumuliertenScore. – useR

4

ist eine Möglichkeit:

x <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 

A <- rbind(x[-length(x)], x[-1]) 
id <- which(colSums(abs(A - c(5, 3))) == 0) 

x[rbind(id, id + 1L)] <- c(8, NA) 
na.omit(x) 

Diese Lösung vorgeschlagen wurde, um es einfacher zu allgemeinen Fällen zu verlängern (Es kann nicht am besten OP Bedürfnis erfüllt, aber ich habe es nur als Übung .)

im allgemeinen, wenn Sie x ein Stück xc in einem Vektor übereinstimmen soll, was wir tun können:

A <- t(embed(x, length(xc))) 
id <- which(colSums(abs(A - rev(xc))) == 0) 

Jetzt id gibt Ihnen den Startindex der passenden Chunk in x.

0
vector <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3) 
temp = rev(which((vector == 5) & (vector[-1] == 3))) # find indexes of 5s followed by 3s 

for (t in temp){ 
    vector = vector[-(t+1)] # remove threes 
    vector[t] = 8    # replace fives with eights 
} 
vector 
# [1] 1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8 
Verwandte Themen