2017-05-30 11 views
1

Ich habe einen DatenrahmenR: match() nur das erste Vorkommen

names2 <- c('AdagioBarber','AdagioBarber', 'Beethovan','Beethovan') 
Value <- c(33,55,21,54) 
song.data <- data.frame(names2,Value) 

ich es arrangieren möchte nach diesem Zeichen Vektor

names <- c('Beethovan','Beethovan','AdagioBarber','AdagioBarber')

I Spiel bin mit(), um dies erreichen

data.frame(song.data[match((names), (song.data$names2)),]) 

Das Problem ist, dass die Übereinstimmung nur zuerst occurenc zurückgibt es

 names2   Value 
3  Beethovan   21 
3.1 Beethovan   21 
1  AdagioBarber  33 
1.1 AdagioBarber  33 
+2

Es gibt keinen Weg von wissen, welche Sie die beiden ‚Beethovan‘ Aufzeichnungen wollen bestellen . Was versuchst du wirklich? Sie haben also eine Liste mit eindeutigen Werten, nach denen die anderen sortiert werden sollen? Wie brichst du Krawatten? – MrFlick

+0

@MrFlick Ich vermute, sie wahrscheinlich nur die Ebenen der 'names2' Spalte neu anordnen und dann den Datenrahmen sortieren? Aber ich bin verwirrt über die Kommentare zu 'match', da explizit dokumentiert wird, dass nur die ersten Übereinstimmungen zurückgegeben werden. – joran

+2

Vielleicht 'song.data $ names2 <- Faktor (song.data $ names2, levels = c ('Beethovan', 'AdagioBarber')); song.data [order (song.data $ names2),] '? – zx8754

Antwort

1

Sie können order verwenden, da @ zx8754 und @ Evan Friedland haben darauf hingewiesen.

> name.order <- c('Beethovan','AdagioBarber')   
> song.data$names2 <- factor(song.data$names2, levels= name.order)            
> song.data[order(song.data$names2), ]                   
     names2 Value   
3 Beethovan 21   
4 Beethovan 54   
1 AdagioBarber 33   
2 AdagioBarber 55   

Grundsätzlich dreht factor die Saiten in ganzen Zahlen und erzeugt eine Verweistabelle von dem, was Zahlen zu dem, was Strings entsprechen. Das Argument levels gibt an, wie diese Nachschlagetabelle aussehen soll. Ohne dieses Argument würde es nur in der Reihenfolge des Auftretens gehen.

So zum Beispiel:

> as.numeric(factor(letters[1:5]))                    
[1] 1 2 3 4 5    
> as.numeric(factor(letters[1:5], levels=c("d","b","e","a","c")))            
[1] 4 2 5 1 3 

Hinweis: Sie müssen absolut sicher sein, müssen Sie alle bekommen (richtig geschrieben) -Spiegel in diesem name.order Vektor, sonst werden Sie mit NA ‚s am Ende in die Ausgabe von order.

(Ich bin nicht sicher, warum sort die Fähigkeit nicht haben Faktoren zu sortieren, aber es ist, was es ist.)

Verwandte Themen