Jakob Richter

Statistik, R, Fotografie und Sonstiges

Zeilen in einer Matrix verdoppeln.

Hier ein kleiner Tipp aus dem R-Praxisleben. Beispiel: In einer Matrix (respektive data.frame) jede Zeile verdoppeln.

1
2
3
4
5
6
daten <- mtcars 
 
#Doppelte Zeilen direkt untereinander
daten_doppelt <- daten[rep(1:nrow(daten),each=2),]
#Doppelte untereinander
daten_doppelt2 <- daten[rep(1:nrow(daten),times=2),]

Ja das ist wirklich nicht schwer. Die Grundidee: Die Selektionsvektoren, welche immer in den eckigen Klammern stehen, kann man natürlich auch nutzen um bestimmte Zeilen mehrfach zu wählen.

Damit es nicht nur bei diesem simplen Beispiel bleibt, was vielleicht jedem eingefallen wäre, noch ein paar Ideen, wie man mit dieser simplen Methode auch wesentlich komplexere Verdopplungen durchführen kann.

Beispiel: In einer Matrix sollen Zeilen mit bestimmten eigenschaft verdreifacht werden.

8
9
10
merkmalerfuellt <- daten$cyl>=6 & daten$gear>=4
wiederholen <- ifelse(merkmalerfuellt,3,1)
daten_dreifach <- daten[rep(1:nrow(daten),times=wiederholen),]

Anmerkungen

rep(x,each/times) hat ein paar unterschiedliche Funktionsweisen. Für each=n kann nur eine Zahl angegeben werden, wie oft ein Item direkt untereinander wiederholt wird. Mit times=n wird angegeben wie oft ein Vektor untereinander wiederholt werden soll. Daneben gibt es noch eine weitere tolle, im zweiten Beispiel verwendete, Funktionsweise: Übergibt man rep(x,times=y) einen Vektor y der gleichen Länge wie x (length(x)), so wiederholt rep() den Eintrag x[i] genau y[i]-mal. Es kann also für jedes Item angegeben werden, wie oft es wiederholt werden soll. Die Duplikate stehen dann sinnvollerweise direkt untereinander.
Ist y zu kurz oder zu lang findet kein Recycling oder eine Kürzung statt!

Leave a Reply